我正在努力联接表的内容,即使在表'users_ratings中没有匹配的记录,我仍试图联接两个表,同时仍从表'movies'获得结果。但似乎没有任何效果,我只能得到一个结果。
-电影表(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
-我想要获得的结果(我应该获得100条记录)
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
答案 0 :(得分:1)
自此以来,您已经放置了ur.type_name = movies
的显式Where条件,因此它在Left联接之后过滤了结果。您需要将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;并仅获取您的应用程序代码所要求的特定列。
答案 1 :(得分:0)
除了您的join
错误之外,我认为group by
也是错误的。
我想你想要
SELECT m.*, MAX(ur.type_id), COUNT(ur.type_id) as vote_count
FROM movies m LEFT JOIN
users_ratings ur
ON m.id = ur.type_id AND ur.type_name= 'movies'
GROUP BY m.id
ORDER BY vote_count DESC;
通常,在SELECT m.*
查询中使用类似GROUP BY
的方法是不正确的。这是允许这样做的一种情况,因为id
在movies
表中是唯一的。
请注意,type_id
现在在SELECT
中具有聚合功能。
答案 2 :(得分:0)
尝试:AND ( ur.type_name = 'movies' OR ur.type_name IS NULL)
。
将显示空结果。
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' OR ur.type_name IS NULL)
GROUP BY name_table.id
Order BY vote_count DESC;`