mysql - LEFT JOIN不返回所有行

时间:2017-07-05 00:08:37

标签: mysql left-join

我拥有什么

问题:我的LEFT JOIN没有返回左表中的所有数据。

以下是我的表格模式:

CREATE TABLE item_to_map
  (
    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    item_id INT UNSIGNED NOT NULL,
    map_id INT UNSIGNED NOT NULL,
    user_id INT UNSIGNED NOT NULL,
    date DATETIME DEFAULT CURRENT_TIMESTAMP,

    INDEX(item_id),
    INDEX(map_id),
    INDEX(date),

    FOREIGN KEY (item_id)
      REFERENCES item (id)
        ON DELETE CASCADE,
    FOREIGN KEY (user_id)
      REFERENCES user (id)
        ON DELETE CASCADE,
    FOREIGN KEY (map_id)
      REFERENCES map (id)
        ON DELETE CASCADE
  );

CREATE TABLE vote_item
  (
    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id INT UNSIGNED NOT NULL,
    item_to_map_id INT UNSIGNED NOT NULL,
    date DATETIME DEFAULT CURRENT_TIMESTAMP,
    score ENUM("-1", "1"),

    INDEX(user_id),
    INDEX(item_to_map_id),
    INDEX(date),
    UNIQUE(user_id, item_to_map_id),

    FOREIGN KEY (item_to_map_id)
      REFERENCES item_to_map (id)
        ON DELETE CASCADE,
    FOREIGN KEY (user_id)
      REFERENCES user (id)
        ON DELETE CASCADE
  );

以下是我vote_item中的数据(忽略user_id映射到多个item_to_map_id的事实)

+----+---------+----------------+---------------------+-------+
| id | user_id | item_to_map_id | date                | score |
+----+---------+----------------+---------------------+-------+
|  1 |      12 |              1 | 2017-07-05 09:41:32 | 1     |
|  2 |      12 |              1 | 2017-07-05 09:41:32 | 1     |
|  3 |      12 |              1 | 2017-07-05 09:41:33 | 1     |
|  4 |      12 |              2 | 2017-07-05 09:45:29 | 1     |
|  5 |      12 |              2 | 2017-07-05 09:45:29 | -1    |
|  6 |      12 |              2 | 2017-07-05 09:45:29 | -1    |
|  7 |      12 |              3 | 2017-07-05 09:56:28 | 1     |
|  8 |      12 |              3 | 2017-07-05 09:56:29 | -1    |
+----+---------+----------------+---------------------+-------+

这里是item_to_map表:

+----+---------+--------+---------+---------------------+
| id | item_id | map_id | user_id | date                |
+----+---------+--------+---------+---------------------+
|  1 |       1 |     20 |      12 | 2017-07-05 09:38:23 |
|  2 |       1 |     20 |      12 | 2017-07-05 09:38:23 |
|  3 |       1 |     20 |      12 | 2017-07-05 09:38:23 |
|  4 |       2 |     20 |      12 | 2017-07-05 09:38:23 |
|  5 |       2 |     20 |      12 | 2017-07-05 09:38:23 |
|  6 |       2 |     20 |      12 | 2017-07-05 09:38:24 |
+----+---------+--------+---------+---------------------+

我尝试了什么

SELECT
  i.id,
  i.item_id,
  v.item_to_map_id,
  IFNULL( SUM(CAST(CAST(v.score AS char) AS SIGNED)), 0 ) AS score
FROM item_to_map i
LEFT JOIN
  vote_item v ON i.id = v.item_to_map_id
GROUP BY v.item_to_map_id;

但是这会返回

+----+---------+----------------+-------+
| id | item_id | item_to_map_id | score |
+----+---------+----------------+-------+
|  4 |       2 |           NULL |     0 |
|  1 |       1 |              1 |     3 |
|  2 |       1 |              2 |    -1 |
|  3 |       1 |              3 |     0 |
+----+---------+----------------+-------+

我的期望

我希望id 5和6也出现

1 个答案:

答案 0 :(得分:1)

按所有(未聚合的)列聚合并修复您的问题:

docker commit 7d372287aa09 test