[英]mysql - LEFT JOIN not returning all rows
問題:我的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和ID 6也將出現
通過所有(未匯總)列進行匯總並解決您的問題:
SELECT i.id, i.item_id, v.item_to_map_id,
COALESCE( 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 i.id, i.item_id, v.item_to_map_id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.