即使没有匹配的数据,SQL Join 2表

时间:2018-09-22 14:26:53

标签: mysql sql

我正在努力联接表的内容,即使在表'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

3 个答案:

答案 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;并仅获取您的应用程序代码所要求的特定列。

此外,您可以阅读Why is SELECT * considered harmful?

答案 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的方法是不正确的。这是允许这样做的一种情况,因为idmovies表中是唯一的。

请注意,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;`