首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使没有匹配的数据,SQL联接2表也是如此。

即使没有匹配的数据,SQL联接2表也是如此。
EN

Stack Overflow用户
提问于 2018-09-22 14:26:53
回答 3查看 45关注 0票数 3

我正在努力加入我的表的内容,我试图连接两个表,同时仍然从表“电影”中获得结果,即使在“用户_评级”表中没有匹配的记录。但这似乎不起作用我只得到一个结果。

-电影表(100项记录)

代码语言:javascript
复制
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项记录)

代码语言:javascript
复制
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;

--我的疑问

代码语言:javascript
复制
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

-查询结果

代码语言:javascript
复制
ID    title_name  creation_date        type_id  vote_count
1     Avatar      2014-05-20 00:00:00  1        1
代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-22 14:32:43

除了您的join错误之外,我认为group by也是错误的。

我想你想:

代码语言:javascript
复制
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中有一个聚合函数。

票数 0
EN

Stack Overflow用户

发布于 2018-09-22 14:28:43

从那时起,您已经设置了ur.type_name = movies的一个显式Where条件,因此它过滤掉了左联接之后的结果。您需要将Where条件转换为LEFT JOIN ON匹配。

相反,请尝试以下几点:

代码语言:javascript
复制
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?

票数 1
EN

Stack Overflow用户

发布于 2018-09-22 21:35:56

试一试:AND ( ur.type_name = 'movies' OR ur.type_name IS NULL)。将显示空结果。

代码语言:javascript
复制
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;`  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52457596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档