簡體   English   中英

mysql-LEFT JOIN不返回所有行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM