2013-12-18 106 views
0

我有我的用戶和朋友表的以下表結構。簡單的MYSQL查詢返回多行

users: first_name, last_name 

friends: to_id, from_id, friend_status 

所以,如果用戶4 and 7是朋友,我把它們存儲在朋友的表作爲4 | 7 | 17 | 4 | 1取決於是誰發起的友誼。我不做重複的條目,所以4 | 7 | 1和7 | 4 | 1不存儲。只有一個將被存儲。

我的問題是,當我想要做一個簡單的搜索朋友的名字是保羅。下面的每個片段都可以自行工作,但是在一起時,我會看到多行顯示不甚真實的用戶,他們甚至不是朋友。

SELECT u.* FROM `users` u, `friends` f WHERE CONCAT(u.first_name,' ',u.last_name) 
like '%paul%' AND ((f.to_id=$logged_in_uid OR f.from_id=$logged_in_uid) 
AND f.friend_status=1); 

再一次,上述甚至不返回朋友,但是後者本身在單獨使用時確實會帶回朋友。

感謝和任何幫助是真正讚賞:)

回答

1

uf之間沒有JOIN Condition

你能試試嗎?

SELECT u.* 
FROM `users` u INNER JOIN `friends` f 
    ON (u.user_id = f.to_id OR u.user_id = f.from_id) AND u.user_id != $logged_in_uid 
WHERE CONCAT(u.first_name,' ',u.last_name) LIKE '%paul%' 
    AND (
     (f.to_id=$logged_in_uid OR f.from_id=$logged_in_uid) 
     AND f.friend_status=1 
    ); 

或者使用UNION擺脫OR這使事情變得複雜,不能使用索引。

SELECT u.* 
FROM `users` u INNER JOIN `friends` f ON u.user_id = f.from_id 
WHERE CONCAT(u.first_name,' ',u.last_name) LIKE '%paul%' 
    AND f.to_id=$logged_in_uid AND f.friend_status=1 

UNION 

SELECT u.* 
FROM `users` u INNER JOIN `friends` f ON u.user_id = f.to_id 
WHERE CONCAT(u.first_name,' ',u.last_name) LIKE '%paul%' 
    AND f.from_id=$logged_in_uid AND f.friend_status=1 
+0

第一個工作!您。是。的。人!!!非常感謝。 – user1011713