2011-05-25 64 views
0

創建一個論壇型網站,我有3個表,一個用於存儲用戶信息(用戶),一個用於原始帖子(線程),另一個用於像SO這樣的upvote系統(票)。MySql如果記錄存在內部選擇查詢

投票表有3列,id,userid和threadid。當用戶上傳一個線程時,一個記錄被插入到投票表中。當我查詢線程時,我想知道用戶是否已投票支持該線程,本質上,如果記錄存在於投票表中並且存在正確的userid和threadid。我可以在兩個查詢中做到這一點,但我認爲必須有一種方法將所有內容都集中在一起。

我目前查詢:

"SELECT t.id, t.title, t.content u.id AS uid, u.username 
FROM threads t, users u 
WHERE t.id = '".$userid."' 
AND t.author = '".$userid."'" 

如果你需要一個更好的主意,下面將查詢所需的結果只有當用戶已經upvoted。我需要查詢仍然返回,如果票表中的記錄不存在(可能返回投票值爲空?)。

"SELECT t.id, t.title, t.content u.id 
AS uid, u.username v.id 
FROM threads t, users u, votes v 
WHERE t.id = '".$threadid."' 
AND t.author = '".$userid."' 
AND v.threadid = t.id 
AND v.userid = '".$userid."'" 

而且我是自學的(並且還在學習)的mysql和數據庫設計,所以如果有一個更好的方法/方法,如連接表,請讓我知道。謝謝。

回答

2

你的第二個查詢是做內部連接,它只會返回出現在連接兩邊的記錄。您希望在投票表上執行左/右外連接,以便即使沒有匹配的投票記錄,仍然可以獲取用戶+線程記錄。

SELECT t.id, t.title, t.content, u.id, u.username, v.id 
FROM threads AS t 
INNER JOIN users AS u ON t.userid = u.id 
LEFT JOIN votes AS v ON (v.userid = u.id and t.id = v.threadid) 
WHERE (u.id = $userid) AND (t.id = $threadid) 

只是猜測在這,但應該足以讓你開始。

相關問題