当条件依赖于一个表中的某些列时,如何查找相交行

时间:2014-05-31 21:22:13

标签: php mysql

订阅

subscriber | subscribeto (columns)
1          | 5
1          | 6
1          | 7
1          | 8
1          | 9
1          | 10
2          | 5
2          | 6
2          | 7

有两个用户拥有ID 1和2.他们订阅了各种用户,我将这些数据插入表订阅。列订阅者表示谁是订阅者,列订阅表示他们订阅了谁。从上表可以得出结论;
用户id = 1订阅了6个用户
用户ID = 2订阅了3个用户

我想找到相互认购(比如Facebook是共同的朋友) 用户1订阅用户5,6,7,8,9,10
用户2订阅用户5,6,7
因此,用户1和2的相互订阅是:5,6,7

我正在尝试创建SQL语句。
我为您的SQL语句提供了用户表,我认为我们只能使用 subscribe 表,但我无法理解。

用户

userid  (columns)
1
2
3
...
...

SQL

"select * from user where (select count( 1 ) from subscribe where subscriber = '1' and subscribeto = user.userid) and (select count( 1 ) from subscribe where subscriber = '2' and subscribeto = user.userid);"

这个SQL可以正常工作,但对于数千个列来说速度非常慢。请为我提供更好的SQL,谢谢。

1 个答案:

答案 0 :(得分:2)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(subscriber INT NOT NULL
,subscribeto INT NOT NULL
,PRIMARY KEY(subscriber,subscribeto)
);

INSERT INTO my_table VALUES
(1,5),
(1,6),
(1,7),
(1,8),
(1,9),
(1,10),
(2,5),
(2,6),
(2,7);

SELECT x.subscribeto mutual_friends 
  FROM my_table x 
  JOIN my_table y 
    ON y.subscribeto = x.subscribeto 
 WHERE x.subscriber = 1 
   AND y.subscriber = 2;
+----------------+
| mutual_friends |
+----------------+
|              5 |
|              6 |
|              7 |
+----------------+