Php Laravel Mysql查询选择条件

Php Laravel Mysql查询选择条件,php,mysql,laravel,laravel-5,phpunit,Php,Mysql,Laravel,Laravel 5,Phpunit,我有两个表格如下: 1) 。网址 等等。。 2). 链接 我想写一个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. 例如,它将查

我有两个表格如下:

1) 。网址

等等。。 2). 链接

我想写一个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.
例如,它将查找并找到所有“URL\u id”=2,并选择所有已批准状态,查找不为NULL且未过期的结束日期,但由于有一个NULL,因此它不会返回它,然后转到“URL\u id”=3,我们有2个已批准且都已过期,并且没有结束日期NULL或未过期,因此我们只返回最新结束日期的那一行

这是一个输出

  id     domain          end_date_max        
  ------------------------------
  9      example.com     2016-01-08 00:00:00 
如何在一个SQL查询中实现这一点?在Laravel中或仅在普通原始查询中


谢谢

Laravel提供了一个非常好的活动记录类,因此您可以不用像这样的原始查询来完成此操作:

$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();

类似这样的东西应该可以解决这个问题,我没有测试代码,所以我希望它能工作。

Laravel提供了一个非常好的活动记录类,因此您可以不用这样的原始查询:

$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,基本上我需要首先获取所有状态=“已批准”然后检查是否至少有一个已结束日期为空或未结束日期已过期。不要获取整个域,看到我的观点了吗?还有其他帮助吗?在这种情况下,您应该尝试反转表,但请注意,如果您不了解MySQL,您可能应该在尝试执行复杂查询之前阅读一本书。在MySQL代码中反转表格示例:“选择t2.id,t2.domain,t1.end_date FROM links t1 LEFT JOIN url t2 on t2.id=t1.url_id,其中t1.end_date不为NULL,t1.end_date>“YOUR_CARBON_date_HERE”和t1.status=“Approved”GROUP BY t1.end_date ORDER BY t1.end_date DESC。是的,我从未尝试过反转MySQL,我知道这是一个复杂的查询你的查询仍然不起作用,它给我的链接是批准的>现在和非空??反转的目的是什么这是返回test.com,它不正确我希望它返回example.com,这并没有检查所有条件它只会得到第一个满足条件的,所以它返回id=1的test.com,基本上我需要首先获取所有status=“Approved”然后检查是否至少有一个已结束日期为空或未结束日期已过期。不要获取整个域,看到我的观点了吗?还有其他帮助吗?在这种情况下,您应该尝试反转表,但请注意,如果您不了解MySQL,您可能应该在尝试执行复杂查询之前阅读一本书。在MySQL代码中反转表格示例:“选择t2.id,t2.domain,t1.end_date FROM links t1 LEFT JOIN url t2 on t2.id=t1.url_id,其中t1.end_date不为NULL,t1.end_date>“YOUR_CARBON_date_HERE”和t1.status=“Approved”GROUP BY t1.end_date ORDER BY t1.end_date DESC。是的,我从未尝试过反转MySQL,我知道这是一个复杂的查询你的查询仍然不起作用,它给我的链接是批准的>现在和非空??倒车有什么意义
$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();