我有三张桌子:
用户
+----+------+
| 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
答案 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列的表,其中每个人都有一个相似的。
可能有一种更有效的方法,但不涉及子查询。