检查两个用户是否喜欢彼此的项目

时间:2014-12-04 21:24:24

标签: mysql sql

我有三张桌子:

用户

+----+------+
| id | name |
+----+------+
|  1 | Foo  |
|  2 | Bar  |
|  3 | La   |
+----+------+

+----+-------+
| id | owner |
+----+-------+
|  1 |     2 |
|  2 |     1 |
|  3 |     2 |
+----+-------+

+----+------+---------+---------+
| id | vote | user_id | item_id |
+----+------+---------+---------+
|  1 |    1 |       1 |       1 |
|  2 |    1 |       2 |       2 |
|  3 |   -1 |       3 |       1 |
|  4 |    1 |       1 |       2 |
|  5 |   -1 |       3 |       2 |
+----+------+---------+---------+

现在,我希望编写一个查询,检查两个特定的user_id,就像每个其他项一样。

我希望获得匹配的两个项目的ID。

编写此查询的最有效方法是什么?我创建了一个sqlfiddle:http://sqlfiddle.com/#!2/c09fa

1 个答案:

答案 0 :(得分:1)

我首先会做一个简单的联接,以获取用户和用户喜欢的用户列表。

SELECT user_id AS id1, items.owner AS id2 FROM votes
       JOIN items ON items.id=item_id;

这将给出一个包含2个ID的表。然后将此表与自身连接并检查每个表是否相等。所以

SELECT * FROM temp t1 JOIN temp t2
    WHERE t1.id1=t2.id2 AND t1.id2=t2.id1

将2组合在一起你会得到:

SELECT * FROM
  (SELECT user_id AS id1, items.owner AS id2 FROM votes
JOIN items ON items.id=item_id) table1
JOIN
  (SELECT user_id AS id1, items.owner AS id2 FROM votes
JOIN items ON items.id=item_id) table2
WHERE
  table1.id1=table2.id2 AND table1.id2=table2.id1;

你不清楚你正在寻找什么样的输出,但是会输出一个包含2列的表,其中每个人都有一个相似的。

可能有一种更有效的方法,但不涉及子查询。