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;
注意:这假定 PostId
在 comment
表中,考虑到表名,这似乎是合理的。
【讨论】:
以上是关于sql查询行为奇怪的主要内容,如果未能解决你的问题,请参考以下文章
Hive SQL 查询中 Regexp_replace 的奇怪行为