2014-10-04 129 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