问题:我的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也出现
答案 0 :(得分:1)
按所有(未聚合的)列聚合并修复您的问题:
docker commit 7d372287aa09 test