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 查询选择条件的主要内容,如果未能解决你的问题,请参考以下文章

我想自学laraver,请诸位前辈给一些建议,谢谢

laravel orm where 条件中 mysql函数 怎么用

laravel orm where 条件中 mysql函数 怎么用

Laravel 查询生成器 where 和 or where

laravel 选择 where 和 where 条件

Laravel where 条件 - pgsql 查询