mySQL子查询返回NULL

时间:2014-10-04 04:11:04

标签: mysql

我有一个博客文章表。如果用户重新登录帖子,则source_hash字段将填充原始帖子的哈希值。我也可以存储原始帖子的作者(用户名),但如果他们更改了用户名......那么,你会看到我要去的地方。

因此,我尝试做的是获取所有帖子的信息,使用父查询中的source_hash字段从子查询中获取原作者的用户名。除了子查询之外,一切都很完美 - 它返回NULL。

我已经删除了一些查询(它相当大)以获得它的信息。希望这是有道理的!

SELECT 
  p.id AS pid 
, p.uid
, p.hash
, p.source_hash
  ...
, u.id AS uid
, u.username
, u.avatar 

, s.username AS source

FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
...

# problematic subquery
LEFT JOIN users s ON (SELECT username FROM posts po LEFT JOIN users s ON s.id=po.uid WHERE po.hash=p.source_hash)

WHERE p.uid=1 
GROUP BY p.id ORDER BY p.id DESC

编辑:我已经创建了一个SQL小提琴,并将所有内容缩减为最基本的组件。在小提琴中,source列应返回lindsey

http://sqlfiddle.com/#!2/0183e/2

1 个答案:

答案 0 :(得分:0)

使用子查询的ON条件在查询中存在问题 - 简而言之,它是错误的。

在这种情况下,我会写下一个查询(测试,返回正确的结果):

SELECT 
  p.id AS pid 
, p.uid
, p.hash
, p.source_hash
  ...
, u.id AS uid
, u.username
, u.avatar 

, u2.username AS source

FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
...

# instead of subquery use left join with posts again for source post
LEFT JOIN posts p2 ON p.source_hash = p2.hash
# then join source post with another user table to get source username
LEFT JOIN users u2 ON u2.id = p2.uid

WHERE p.uid=1 
GROUP BY p.id ORDER BY p.id DESC