我正在努力加入我的表的内容,我试图连接两个表,同时仍然从表“电影”中获得结果,即使在“用户_评级”表中没有匹配的记录。但这似乎不起作用我只得到一个结果。
-电影表(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 1ID 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发布于 2018-09-22 14:32:43
除了您的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中有一个聚合函数。
发布于 2018-09-22 14:28:43
从那时起,您已经设置了ur.type_name = movies的一个显式Where条件,因此它过滤掉了左联接之后的结果。您需要将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,您应该避免使用基于通配符(*)的选择;并且只获得应用程序代码所要求的特定列。
此外,您还可以阅读 considered harmful?
发布于 2018-09-22 21:35:56
试一试: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;` https://stackoverflow.com/questions/52457596
复制相似问题