【问题标题】:Select a row that doesn't exist in t2, based on t1 mysql根据 t1 mysql 选择 t2 中不存在的行
【发布时间】:2016-01-29 21:38:12
【问题描述】:

我正在使用 MySQL 和 PHP。 我有 2 张桌子。

第一个有日期。 这个表叫dates

+-------+-------------+----------+---------+
|  id   |  unixTime   |  month   |  year   |
+------------------------------------------+
|  1    | 1443657600  |    10    |   2015  |
|       |             |          |         |
|  2    | 1443657600  |    11    |   2015  |
|       |             |          |         |
|  3    | 1443657600  |    12    |   2015  |
|       |             |          |         |
|  4    | 1443657600  |    01    |   2016  |
|       |             |          |         |
+-------+-------------+----------+---------+

如果您查询SELECT * FROM analytics WHERE clientfk=36,下表将显示。只有 3 个条目,因为客户 #36 在 1 月份不再是客户。

这个表叫做analytics

+------------------------------------------------+
|  id       datefk          Value       clientfk |
+------------------------------------------------+
|  156        1          "some value"       36   |
|                                                |
|  157        2        "another value"      36   |
|                                                |
|  157        3         "thrid value"       36   |
|                                                |
+------------------------------------------------+

我想加入(?)联合(?)这些表并获得如下所示的输出:(注意,null 值)

+------------------------------------------------+
|  month      year      client      value        |
+------------------------------------------------+
|   10         2015       36      "Some value"   |
|                                                |
|   11         2015       36     "Another value" |
|                                                |
|   12         2015       36      "third value"  |
|                                                |
|   1          2016       36         NULL        |
+------------------------------------------------+

我尝试了下面的查询,在无数其他事情中,但总是不返回任何内容或只返回 3 行

SELECT *
FROM analytics a
WHERE a.clientfk = 36
AND NOT EXISTS (SELECT null FROM dates d
                WHERE d.id = a.datefk)

【问题讨论】:

    标签: php mysql join null left-join


    【解决方案1】:

    您正在寻找LEFT JOIN

    SELECT `dates`.`month`, `dates`.`year`, `analytics`.`clientfk` AS 'client', `analytics`.`value`
        FROM `dates`
            LEFT JOIN `analytics` ON `analytics`.`datefk` = `dates`.`id` AND `analytics`.`clientfk` = '36'
        WHERE 1
    

    【讨论】:

    • 这就是我所要求的,谢谢,但我也想返回 2016 年 1 月客户端 36 为 NULL 行的所有客户端。我认为如果我省略了AND analytics.clientfk = '36',它会起作用。我是否遗漏了一些明显的东西,或者这是一个完全不同的问题?
    【解决方案2】:

    您将通过 LEFT JOIN 获得结果。

    SELECT 
    d.month as month, d.year as year, a.clientfk as client, a.value as value 
    from dates d
    LEFT JOIN analytics a on d.id = a.datefk 
    WHERE a.clientfk = 36
    

    这样你会得到客户端也为空。因为您在分析中没有日期 id 4 的数据。

    +------------------------------------------------+
    |  month      year      client      value        |
    +------------------------------------------------+
    |   10         2015       36      "Some value"   |
    |                                                |
    |   11         2015       36     "Another value" |
    |                                                |
    |   12         2015       36      "third value"  |
    |                                                |
    |   1          2016       NULL         NULL      |
    +------------------------------------------------+
    

    但如果您仍希望客户端 ID 出现在该列中,您可以使用 case。

    SELECT d.month as month, d.year as year, CASE 
              WHEN a.clientfk = null THEN 36
              ELSE a.clientfk 
             END as client, a.value as value
    from 
    dates d
    LEFT JOIN analytics a on d.id = a.datefk 
    WHERE a.clientfk = 36
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2011-11-05
      • 2018-02-12
      相关资源
      最近更新 更多