SQL查询以获取除我之外的关注者

时间:2014-06-16 22:08:27

标签: mysql sql

我尝试进行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`

3 个答案:

答案 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_toid_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 -> 1010 -> 1),他们就不会显示两次。