2011-09-26 87 views
3

我有一個數據庫設置,以便用戶名(用戶名)和id(id)存儲在members表中。SQL:匹配多列值

我有記錄報告中其他的表,我記錄表(FID),誰報告說,它(RID)每列和他們是誰報告(ID)相匹配,其既爲用戶在會員表ID。

我怎樣才能得到一個查詢來拉出rid和id的用戶名?

我當前的查詢是

SELECT selfreport.fid, selfreport.rid, 
     selfreport.id, members.username as username 
FROM members, selfreport 
WHERE members.id = selfreport.id 
ORDER BY fid 

但這只是獲取用戶名誰,他們的報告。我怎樣才能得到它拉兩個用戶名?

+0

我與你想要的東西還挺困惑,您能告訴我們所需的輸出的例子嗎? – Lamak

回答

2

你需要加入members兩次:

SELECT selfreport.fid, 
     selfreport.rid, 
     selfreport.id, 
     m1.username AS ReportToUsername, 
     m2.username AS ReporteeUsername 
FROM selfreport 
     INNER JOIN members m1 
     ON m1.id = selfreport.id 
     INNER JOIN members m2 
     ON m2.id = selfreport.rid 
ORDER BY fid 

既然你在做原始查詢中的一個隱含的加入,我相信INNER JOIN會適合你。但是,如果在selfreport.idselfreport.rid中可能有空值,則應該使用LEFT JOIN代替。

+0

m1.id = selfreport.rid'上的內部連接成員m2應該是'm2.id = selfreport.rid'上的內部連接成員m2' – Johan

+0

這是一個錯字@Johan,它現在已經修復,謝謝 –

3

您需要加入您的會員表兩次。嘗試是這樣的:

SELECT  selfreport.fid, 
      selfreport.rid, 
      selfreport.id, 
      COALESCE(WhoReported.username, 'Not Specified') AS WhoReportedUN, 
      COALESCE(ReportedTo.username, 'Not Specified') AS ReportedToUN 
FROM  selfreport 
LEFT JOIN members WhoReported ON WhoReported.id = selfreport.id 
LEFT JOIN members ReportedTo ON ReportedTo.id = selfreport.rid 
ORDER BY fid 
+0

+ 1爲好和清晰的別名。 – Johan

2

不要使用隱式SQL '89連接它們是一個反模式。
改爲使用顯式連接語法。

SELECT s.fid, s.rid, s.id, m1.username as username, m2.username as rusername 
FROM selfreport S 
INNER JOIN members m1 ON (m1.id = s.id) 
INNER JOIN members m2 ON (m2.id = s.rid) 
ORDER BY s.fid 

如果idrid是可選的,使用左連接。

SELECT 
    s.fid, s.rid, s.id 
    , COALESCE(m1.username, 'nobody') as username 
    , COALESCE(m2.username, 'nobody') as rusername 
FROM selfreport S 
LEFT JOIN members m1 ON (m1.id = s.id) 
LEFT JOIN members m2 ON (m2.id = s.rid) 
ORDER BY s.fid