2014-12-04 16 views
0

我有三个表:检查两个用户喜欢对方的项目

用户

+----+------+ 
| 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

什么结果你想要一个布尔(num行)或recods的喜欢? – 2014-12-04 21:26:34

+0

你真的试过为自己编写查询吗?请告诉我们你已经做了什么努力。 – 2014-12-04 21:28:08

回答

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列,每个人都在它有一个共同的喜欢。

虽然可能有更高效的方法,但不涉及子查询。

相关问题