2010-04-11 90 views
0

嘿傢伙快速的問題,我總是使用左連接,但是當我離開連接兩次時,我總是得到有趣的結果,通常是重複的。我目前正在做一個查詢,左連接兩次檢索所需的必要信息,但我想知道是否有可能建立另一個選擇語句,所以我不需要兩個左連接或兩個查詢,或者如果有更好的方法。例如,如果我可以選擇table.topic中的topic.creator作爲第一個AS,那麼我可以在用戶中選擇該變量,並將連接保留爲table.scrusersonline。提前感謝您的任何建議。需要替代兩個左連接

SELECT * FROM scrusersonline 
    LEFT JOIN users ON users.id = scrusersonline.id 
    LEFT JOIN topic ON users.username = topic.creator 
WHERE scrusersonline.topic_id = '$topic_id' 

該查詢的全部意義在於檢查topic.creator是通過網上從table.topic檢索他的名字,並在table.users匹配他的身份證,然後檢查,如果他是在table.scrusersonline。它不幸地產生了重複的條目,因此在我的腦海中是不準確的。

+0

之間的交叉

SELECT * FROM scrusersonline JOIN users ON users.id = scrusersonline.id LEFT JOIN topic ON scrusersonline.topic_id = '$topic_id' AND users.username = topic.creator 

順便說一句,LEFT JOINusers不需要兩個左派是正確的。 – 2010-04-11 01:55:48

+0

@Sfaceface,請注意正確格式化您的代碼。它使其他人更容易幫助你。 – 2010-04-11 01:57:16

+0

請舉一個重複條目的例子。除非有多個記錄,否則不應該有多個條目。使用不同可能會解決,除非記錄不是真的重複。 – Don 2010-04-11 02:01:43

回答

1

一種選擇是將你加入這樣的:

SELECT * 
    FROM scrusersonline 
    LEFT JOIN (users ON users.id = scrusersonline.id 
      JOIN topic ON users.username = topic.creator) 
WHERE scrusersonline.topic_id = '$topic_id' 
+0

您的連接條件上的嵌套行嗎? 'ON users.id = scrusersonline.id'子句應該在括號外,不是嗎? – 2010-04-11 02:16:05

1

嘗試:

select * from topic t 
    left outer join (
     users u 
     inner join scrusersonline o on u.id = o.id 
    ) on t.creator = u.username 

如果o.id爲空,則用戶下線。

2

無論您想要回數據,都使用LEFT JOIN。在這種情況下,如果創建者處於脫機狀態,則不返回行將是一個很好的指示 - 所以刪除LEFT連接並僅進行常規連接。

SELECT * 
    FROM scrusersonline AS o 
    JOIN users AS u ON u.id = o.id 
    JOIN topic AS t ON u.username = t.creator 
WHERE o.topic_id = '$topic_id' 
+0

如果我回復結果,我仍然只打印兩次用戶名。我想這是可以的,因爲我只是想要一個行數,但是在連接方面有什麼不同,它們似乎都是一樣的。 – Scarface 2010-04-11 02:17:32

+2

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – 2010-04-11 02:41:35

+0

漂亮的文章感謝cp,這真的清除了事情 – Scarface 2010-04-11 02:46:21

0

那豈不是更好地狀態移動到連接來匹配topic_idtopics表。我認爲這將解決您的問題,由於重複來自與topics表連接:因爲你似乎尋找scrusersonlineusers