我的用户和朋友表有以下表格结构。
users: first_name, last_name
friends: to_id, from_id, friend_status
因此,如果用户4 and 7
是朋友,我会将其作为4 | 7 | 1
或7 | 4 | 1
存储在朋友的表中,具体取决于发起友情的人。我不做重复的条目所以4 | 7 | 1和7 | 4 | 1未存储。只存储一个。
我的问题是当我想简单搜索名为Paul的朋友时。下面的每个片段都可以自己运行,但是在一起,我会得到多行显示不熟练的用户,甚至不是朋友。
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);
同样,上面的内容甚至没有归还朋友,但仅后一部分确实会在朋友自己使用时带回来。
谢谢,真的很感激任何帮助:)
答案 0 :(得分:1)
JOIN Condition
和u
之间没有f
。
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