2014-10-04 362 views
1

我有一个博客文章表。如果用户重新登录帖子,则source_hash字段将填入原始帖子的哈希值。我也可以存储原始文章的作者(用户名),但是如果他们更改了用户名......那么您会看到我要去哪里。mySQL子查询返回NULL

所以我想要做的是获取所有帖子的信息,从子查询中使用父查询中的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

+0

是您的所有独立的子查询有数据,你测试 – anish 2014-10-04 04:18:06

+0

@anish是,子查询得到正确的用户名时我提供了散列'SELECT s.username FROM posts po LEFT JOIN users s ON s.id = po.uid WHERE po.hash ='2djeij83k'' – timgavin 2014-10-04 04:24:05

+0

是否可以发布表结构和一些测试数据? [SQL小提琴](http://sqlfiddle.com/)会很有帮助。 – wchiquito 2014-10-04 07:45:06

回答

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 
+0

这样做的伎俩。谢谢! :) – timgavin 2014-10-04 17:27:26