Laravel Mysql 查询选择条件
Posted
技术标签:
【中文标题】Laravel Mysql 查询选择条件【英文标题】:Laravel Mysql Query Select with condition 【发布时间】:2017-04-24 06:31:21 【问题描述】:我有两张表如下:
1)。网址
id domain created_at
------------------------------------------------
1 google.com 2016-11-30 00:00:00
2 test.com 2016-11-29 00:00:00
3 example.com 2016-11-26 00:00:00
等等。 2)。链接
id urls_id end_date created_at status
---------------------------------------------------------------------------
1 2 2016-11-30 00:00:00 2016-11-30 00:00:00 Approved
2 2 2016-12-01 00:00:00 2016-11-30 00:00:00 Approved
3 2 NULL 2016-11-30 00:00:00 Approved
4 2 2017-01-01 00:00:00 2016-12-01 00:00:00 Approved
5 2 2016-01-01 00:00:00 2016-12-01 00:00:00 Pending
6 3 2016-11-24 00:00:00 2016-12-01 00:00:00 Pending
7 3 2016-01-01 00:00:00 2016-12-01 00:00:00 Approved
8 3 NUll 2016-12-02 00:00:00 Pending
9 3 2016-01-08 00:00:00 2016-12-01 00:00:00 Approved
10 3 NUll 2016-12-02 00:00:00 Pending
我想编写一个 mysql 查询以返回以下条件: 每个域一行,满足以下条件:
1). end_date NOT NULL AND
2). end_date > Carbon::now() (I am using carbon) not expired AND
3). status is "Approved" AND
4). return latest end_date closer to present or now.
例如,它将查找并找到所有 "urls_id"= 2 并选择 ALL status Approved 并查找非 NULL 且未过期的 end_date ,但由于有一个 Null ,因此它不会返回它,然后继续到 "urls_id"= 3 并且我们有 2 个已批准并且都已过期并且没有 end_date NULL 或未过期所以我们只会返回最新 end_date 的那一行
这是一个输出
id domain end_date_max
------------------------------
9 example.com 2016-01-08 00:00:00
我们如何在一个 SQL 查询中做到这一点?在 Laravel 中或只是简单的原始查询
谢谢
【问题讨论】:
【参考方案1】:Laravel 提供了一个非常好的 Active Record 类,所以你可以在没有像这样的原始查询的情况下做到这一点:
$result = DB::table('urls')
->leftJoin('links', 'urls.id', '=', 'links.urls_id')
->whereNotNull('links.end_date')
->where('links.end_date','>', Carbon::now())
->where('links.status','Approved')
->orderBy('links.end_date','DESC')
->groupBy('urls.domain')
->get();
这样的东西应该可以解决问题,我没有测试代码,所以我希望它可以工作。
【讨论】:
这是返回 test.com ,它不正确我希望它返回 example.com ,这不会检查所有条件它只会得到第一个满足条件的条件,所以它返回 test.com id =1 ,基本上我需要先获取 ALL status="Approved" 然后检查是否至少 ONE 有 end_date NULL 或 end_date expired 不要得到整个域,你明白我的意思 还有其他帮助吗? 在这种情况下,您应该尝试反转表,但请注意,如果您对 MySQL 没有任何了解,您可能应该在尝试执行复杂查询之前阅读一本书。反转 MySQL 代码中的表示例:“SELECT t2.id,t2.domain,t1.end_date FROM links t1 LEFT JOIN url t2 on t2.id = t1.urls_id WHERE t1.end_date IS NOT NULL AND t1.end_date > "YOUR_CARBON_DATE_HERE " AND t1.status = 'Approved' GROUP BY t1.end_date ORDER BY t1.end_date DESC" . 是的,我从未尝试过逆向 mysql ,我知道这是一个复杂的查询 您的查询仍然无效,它给了我已批准和 >now 且 Not Null 的链接?逆转的意义何在以上是关于Laravel Mysql 查询选择条件的主要内容,如果未能解决你的问题,请参考以下文章
laravel orm where 条件中 mysql函数 怎么用
laravel orm where 条件中 mysql函数 怎么用