我有两张表如下:
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并选择所有状态已批准并查找非NULL且未过期的end_date,但由于有一个Null然后它不会返回它,然后继续to“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或只是简单的Raw查询
由于
答案 0 :(得分:0)
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();
这样的事情应该可以解决问题,我没有测试代码,所以我希望它有效。