2010-07-02 99 views
0

我遇到了設計正確的SQL查詢問題。我已經厭倦了像今天這樣一個地獄,已經(即將截止日期)工作超過12個荷魯斯,並不能找到問題......MySQL:加入兩個表

表:

buddies | userid | buddyid 
users | id | username 

現在,我想做什麼: 查詢所有用戶朋友的表夥伴(當ID = userid OR ID = buddyid時)。沒有問題。

問題出現在我嘗試加入用戶表以獲取用戶名時,用戶名爲NULL,找不到原因。

你想幫我嗎?

這裏的工作查詢(但返回空的用戶名)

SELECT username 
FROM (
`users_buddies` 
) 
LEFT JOIN `users` ON ('users.id' = 'buddyid' 
OR 'users.id' = 'userid') 
WHERE `userid` =1 
OR `buddyid` =1 

預先感謝任何幫助。我確定這是一個小錯誤(由我引起),但實際上找不到它。花了一個多小時,然後決定問。

問候, 湯姆

回答

1

微小的錯誤是,你是在ON狀態下使用不正確的報價

變化

'users.id' = 'buddyid' OR 'users.id' = 'userid' 

`users`.`id` = `buddyid` OR `users`.`id` = `userid` 
3

認爲它的報價,試圖這個:

SELECT username 
    FROM users_buddies ub 
     LEFT JOIN users u 
     ON u.id In (ub.userId, ub.buddyid) 

其次,您的Where條件沒有意義。如果你只是想來一個名字了,那麼你可以把它限制在userid = 1buddyId = 1 ..(這是同一個用戶,無論他是在user_buddies用戶,或在user_buddies好友)

如果你想要的是找到與userid = 1用戶的所有好友,那就試試這個:

SELECT b.username 
    FROM users_buddies ub 
     LEFT JOIN users b 
     ON b.id = ub.buddyid 
    Where ub.userid = 1 

,甚至更好,

Select u.username User, b.username Buddy 
    From users_buddies ub 
     LEFT JOIN users u 
     ON u.id = ub.userid 
     LEFT JOIN users b 
     ON u.id = ub.buddyid   
    Where ub.userid = 1 
0

你爲什麼用'字符對象的名字呢?

SELECT username 
FROM users_buddies  
LEFT JOIN users ON (users.id = 'buddyid' 
OR users.id = 'userid') 
WHERE userid =1 
OR buddyid =1 
0

現在大家都已經發現了,不是這個嗎?

SELECT username 
    FROM users_buddies LEFT JOIN 
     users ON (users.id = buddyid OR users.id = userid) 
    WHERE userid = 1 OR 
      buddyid = 1; 

無論如何,所有這些「標記」的想法是什麼?

+1

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html – 2010-07-02 13:09:16

+0

當然,Naktibalda是對的。 – Tom 2010-07-02 13:15:29

+0

謝謝,jsummers。或許,我認爲在這種情況下,最好不要爲表名使用保留字。 – 2010-07-02 18:54:24

0

正如其他人所觀察到的,您正在使用錯誤的引號。

'字符用於引用字符串,而不是對象。所以,你正在做一對字符串比較。字符串'user.id'將永遠不會等於字符串'buddyid',以及您的其他比較的同上,所以查詢不會返回任何內容。

對於引用對象(表,列等),您必須使用反引號字符`。

如果對象的名稱與保留字相同或者包含非標準字符(空格等),則只需引用對象。所以,在這個查詢中,實際上不需要任何引號字符。

IMO,如果你必須引用一個對象,這是一個好兆頭,你不應該使用這個特定的名稱。

+0

是的,我知道......但謝謝你的回答。 – Tom 2010-07-02 13:15:05