我有一个博客文章表。如果用户重新登录帖子,则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
答案 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