【问题标题】:sql query is behaving strangesql查询行为奇怪
【发布时间】: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 。 . .我对下划线没有非常强烈的意见(就我个人而言,我会忽略它)。我确实对一致性有强烈的看法。

标签: mysql sql


【解决方案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 表中,考虑到表名,这似乎是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2010-11-26
      • 2012-09-24
      • 2012-06-05
      相关资源
      最近更新 更多