【问题标题】:MySQL SELECT JOIN with empty row returnsMySQL SELECT JOIN 与空行返回
【发布时间】:2020-07-02 00:43:54
【问题描述】:

我有以下 MySQL 表:

[用户]

| id | name    |
|----|---------|
| 1  | John    |
| 2  | Anna    |
| 3  | Peter   |

[次]

| user_ID | date       | time   |
|---------|------------|--------|
| 1       | 2020-03-20 | 07:00  |
| 1       | 2020-03-21 | 08:00  |
| 3       | 2020-03-22 | 09:00  |

我的查询看起来像:

SELECT name, date, time 
FROM users 
INNER JOIN times ON times.user_ID = users.id 
WHERE date = '2020-03-22';

我得到的是:

| name    | date       | time   |
|---------|------------|--------|
| Peter   | 2020-03-22 | 09:00  |

我想要的是:

| name    | date       | time   |
|---------|------------|--------|
| John    |            |        |
| Anna    |            |        |
| Peter   | 2020-03-22 | 09:00  |

有没有办法将时间表中不存在的行(不是字段!)与用户表连接起来?

【问题讨论】:

  • 考虑将日期和时间存储为单个实体
  • 我会使用 UNION 而不是 Inner Join

标签: mysql sql join


【解决方案1】:

使用LEFT JOIN。然后需要将第二张表的限制放到ON子句中。

SELECT name, date, time 
FROM users 
LEFT JOIN times ON times.user_ID = users.id AND date = '2020-03-22';

【讨论】:

    【解决方案2】:

    使用left join 并将where 子句移至on

    SELECT name, date, time 
    FROM users 
    left JOIN times ON times.user_ID = users.id and date = '2020-03-22';
    

    【讨论】:

    • 谢谢!这让我对它是如何工作的有了正确的认识。我已经想过使用左连接和右连接,但我在 where 子句上做错了。现在我喜欢它谢谢!我也可以用一些默认值替换空字段吗? (如“00:00:00”)
    • @3x3cut0r 是的,如果 ifnull 函数可以
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多