我尝试进行SQL查询以获取除我之外的所有关注者。
我有以下表格:
用户
| id_user | username |
| 1 | xaxa |
| 2 | toto |
| 3 | bubu |
| 4 | yiyi |
| 5 | pepe |
| 6 | sisi |
| 7 | fifi |
| 8 | mama |
| 9 | juju |
| 10 | cece | => me
朋友
| id_friend | id_user | id_user_to |
| 1 | 10 | 1 |
| 2 | 2 | 10 |
| 3 | 2 | 1 |
| 4 | 6 | 3 |
| 5 | 2 | 9 |
| 6 | 6 | 7 |
| 7 | 5 | 3 |
| 8 | 10 | 5 |
| 9 | 9 | 8 |
| 10 | 8 | 10 |
我想要这个:
我的朋友们
| id_user | name |
| 1 | xaxa |
| 2 | toto |
| 5 | pepe |
| 8 | mama |
实际上我在此查询的结果中有id_user 10
(me)=>
SELECT id_user, name
FROM `users`
WHERE id_user NOT IN (
SELECT `id_user` FROM `friends`
WHERE ( `id_user` = 10 OR `id_user_to` = 10 ))
OR id_user NOT IN (
SELECT `id_user_to` FROM `friends`
WHERE ( `id_user` = 10 OR `id_user_to` = 10 ))
GROUP BY `id_user`
答案 0 :(得分:5)
解决方案是两个简单连接的联合:
SELECT u.id_user, u.username name
FROM friends f
JOIN users u ON u.id_user = f.id_user_to
WHERE f.id_user = 10
UNION
SELECT u.id_user, u.username
FROM friends f
JOIN users u ON u.id_user = f.id_user
WHERE f.id_user_to = 10
请注意,关键字UNION
会从结果中删除重复项,因此当两个用户之间的双向朋友链接时,无需编写任何特殊的代码来处理案例(仅供参考,{{1}保留重复)。
因为每个查询每个表最多使用一个索引,通过将查询拆分为两部分,如果在friends表的用户id列上创建索引,则此查询将很好地扩展(对数百万用户)
没有必要编写任何代码以处理"除了我"条件,除非你在朋友表中排成一行,因为你是你自己的朋友,你不会。
SqlFiddle:http://sqlfiddle.com/#!9/7cbb3/4
答案 1 :(得分:2)
这应该做:
SELECT u.id_user, u.username name
FROM `friends` f
JOIN `users` u
ON u.id_user = f.id_user_to and f.id_user = 10
or u.id_user = f.id_user and f.id_user_to = 10
ORDER BY u.id_user
SqlFiddle:http://sqlfiddle.com/#!9/7cbb3/1
答案 2 :(得分:1)
所以基本上你需要得到任何方向相关的用户(id_user -> id_user_to
或id_user_to -> id_user
)
您可以使用以下查询之一执行其中一项:
SELECT friends.id_user, users.name
FROM users
JOIN friends on users.id_user = friends.id_user
WHERE friends.id_user_to = 10
SELECT friends.id_user_to, users.name
FROM users
JOIN friends on users.id_user = friends.id_user
WHERE friends.id_user = 10
但是你想要双方。一种方法是同时进行两个查询和UNION
。您可以这样做,同时还添加名称
SELECT friends.id_user, users.name
FROM users
JOIN friends on users.id_user = friends.id_user
WHERE friends.id_user_to = 10
UNION
SELECT friends.id_user_to, users.name
FROM users
JOIN friends on users.id_user = friends.id_user
WHERE friends.id_user = 10
还值得注意的是,UNION
只会向您显示不同的行,因此如果您有双向用户(例如1 -> 10
和10 -> 1
),他们就不会显示两次。