我正在努力连接我的表的内容,我正在尝试连接两个表,同时仍然从表“电影”中获取结果,即使表“users_ratings”中没有匹配的记录。但它似乎不起作用我只得到一个结果。
--电影表(100条记录)
CREATE TABLE IF NOT EXISTS `movies` (
`ID` int(20) NOT NULL,
`title_name` vachar(255) NOT NULL,
`creation_date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--评分表(1条记录)
CREATE TABLE IF NOT EXISTS `users_ratings` (
`ID` int(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`type_id` bigint(20) NOT NULL,
`type_name` vachar(255) NOT NULL,
`score` int(11) NOT NULL,
`creation_date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--我的查询
SELECT name_table.*, ur.type_id, count(ur.type_id) vote_count
FROM `movies` name_table
left JOIN users_ratings ur ON name_table.id = ur.type_id
WHERE ur.type_name= 'movies'
GROUP BY ur.type_id
Order BY vote_count DESC
--查询结果
ID title_name creation_date type_id vote_count
1 Avatar 2014-05-20 00:00:00 1 1
--Results I'm trying to get (Should I get 100 records)
ID title_name creation_date type_id vote_count
1 Avatar 2014-05-20 00:00:00 1 1
2 Avengers 2014-05-20 00:00:00 NULL NULL
3 Ant-Man 2014-05-20 00:00:00 NULL NULL
4 Jurassic World 2014-05-20 00:00:00 NULL NULL
5 Rampage 2014-05-20 00:00:00 NULL NULL
6 Black Panther 2014-05-20 00:00:00 NULL NULL
7 Tombe Raider 2014-05-20 00:00:00 NULL NULL
8 Deadpool 2014-05-20 00:00:00 NULL NULL
9 Pacific Rim 2014-05-20 00:00:00 NULL NULL
最佳答案
因为您已经放置了 ur.type_name = movies
的显式 Where 条件,所以它会在 Left join 之后过滤掉结果。您需要将 Where 条件转换为 LEFT JOIN ON
匹配。
请尝试以下操作:
SELECT name_table.*, ur.type_id, count(ur.type_id) vote_count
FROM `movies` name_table
left JOIN users_ratings ur ON name_table.id = ur.type_id
AND ur.type_name= 'movies'
GROUP BY name_table.id
Order BY vote_count DESC
注意: As pointed out by @Strawberry ,您应该避免使用基于通配符 (*) 的 Select;并仅获取您的应用程序代码所需的特定列。
此外,您可以阅读 Why is SELECT * considered harmful?
关于mysql - SQL Join 2 tables 即使没有匹配的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52457596/