sql查询行为奇怪

Posted

技术标签:

【中文标题】sql查询行为奇怪【英文标题】:sql query is behaving strange 【发布时间】:2016-02-24 06:33:33 【问题描述】:

我有一个问题

select c.CommentId
,c.CommentText
, c.CommenterId
, c.CommentDate
, u.first_name
, u.last_name
, i.ImageName
, i.Format 
from comment c 
join users u 
  on  c.CommenterId = u.user_id 
join user_profile_image i 
  on u.user_id = i.UserId 
where PostId = 76 
 order 
  by CommentDate desc 
limit 10

当 i.ImageName 字段在表中为空时,此查询返回空结果。如果 ImageName 字段为空,我想返回该行。我该怎么做?

【问题讨论】:

出于好奇,您为什么要在一个表中调用字段user_id 而在另一个表中调用userid @GordonLinoff 你是什么意思?我使用了一些现成的使用下划线的登录系统,但我个人不喜欢这样。如果这能满足你的好奇心? FWIW,我更喜欢下划线。它可以防止 Pen Island 品种混淆。 笔岛品种??? :o @whatever 。 . .我对下划线没有非常强烈的意见(就我个人而言,我会忽略它)。我确实对一致性有强烈的看法。 【参考方案1】:

JOIN 对于 mysql 默认为 INNER JOIN - 尝试更改

join user_profile_image i

LEFT join user_profile_image i

这里接受的答案有一个很好的视觉解释:Difference in MySQL JOIN vs LEFT JOIN

【讨论】:

现在我不是太累了就是我太笨了..我不知道该怎么办...hhh谢谢..【参考方案2】:

要在 ImageName 字段为空时包含行,请使用 LEFT JOIN,如下所示:

SELECT c.CommentId,c.CommentText, c.CommenterId, c.CommentDate, u.first_name,
u.last_name,i.ImageName,i.Format
FROM comment c 
INNER JOIN users u ON c.CommenterId=u.user_id 
LEFT JOIN user_profile_image i ON u.user_id=i.UserId
WHERE PostId = 76
ORDER BY CommentDate DESC
LIMIT 10;

【讨论】:

【参考方案3】:

问题并不完全在于i.ImageName。问题是没有与用户关联的图像。 join 找不到图像,如果没有匹配,则不会返回用户。

解决方案是使用left join。我的倾向是完全用left join 编写查询:

select c.CommentId, c.CommentText, c.CommenterId, c.CommentDate,
       u.first_name, u.last_name,
       i.ImageName, i.Format
from comment c left join
     users u
     on c.CommenterId = u.user_id left join
     user_profile_image i
     on u.user_id = i.UserId
where PostId = 76
order by c.CommentDate desc
limit 10;

注意:这假定 PostIdcomment 表中,考虑到表名,这似乎是合理的。

【讨论】:

以上是关于sql查询行为奇怪的主要内容,如果未能解决你的问题,请参考以下文章

Hive SQL 查询中 Regexp_replace 的奇怪行为

SQL GROUP BY 奇怪的行为

子查询中存在 CASE WHEN 的 SQL 中的奇怪行为(MySQL 5.5)

SSIS 查找行为很奇怪

SQL MAX 函数奇怪的行为

SQL Alchemy奇怪的行为从同一个表中加入多个列