mySQL子查询返回NULL

mySQL子查询返回NULL,mysql,Mysql,我有一张写博客文章的桌子。如果用户重新记录一篇文章,那么source\u hash字段将填充原始文章的hash。我也可以存储原始帖子的作者(用户名),但如果他们更改用户名。。。好吧,你知道我要去哪里 所以我要做的是从父查询中使用source\u hash字段从子查询中获取帖子的所有信息,以及原始作者的用户名。除了子查询之外,其他一切都可以正常工作-它返回NULL 我已经去掉了一些查询(它相当大),以了解它的实质。希望这是有意义的 SELECT p.id AS pid , p.uid ,

我有一张写博客文章的桌子。如果用户重新记录一篇文章,那么
source\u hash
字段将填充原始文章的hash。我也可以存储原始帖子的作者(用户名),但如果他们更改用户名。。。好吧,你知道我要去哪里

所以我要做的是从父查询中使用
source\u 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 FIDLE,并将所有内容缩减到最基本的组件。在小提琴中,
source
列应返回
lindsey


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

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


你的所有独立子查询都有数据,你测试了吗that@anish是的,当我提供hash
SELECT s.username FROM posts po LEFT JOIN users s ON s.id=po.uid,其中po.hash='2djeij83k'
是否可以发布表结构和一些测试数据时,子查询会获得正确的用户名?。A会有帮助的。@wchiquito感谢您的关注,我已经用最基本的组件创建了一个小提琴:
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