Mysql动态交叉表在一个表上进行Pivot比较

时间:2015-07-27 22:07:11

标签: mysql

我有多对多的表设置。这是我关注的表格的一个例子。

many_to_many_id,foreign_key_id
1,1 1,2 1,3 2,1 2,2 3,1 3,4,

我需要给many_to_many_id 1找到在第一个集合中存在匹配外键的任何其他many_to_many_ids。给定第一组1,2,3附加到many_to_many_id将返回2作为1,并且2在集合内,但3不会返回,因为4不是测试集的一部分。我的老板说我应该使用动态交叉表创建两个表来与连接进行比较。我找了一些例子,但没有帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用一些简单的子查询来完成此操作。第一个将确保每个many_to_many_id在您要查找的集合中至少有一个foreign_key_id(1,2,3),第二个将确保在您正在寻找的集合中,即使只有一个foreign_key_id ,也不会

SET @search_id = 1;

SELECT m.many_to_many_id FROM SampleTable m
WHERE m.many_to_many_id != @search_id
AND     EXISTS ( SELECT 1 FROM SampleTable a WHERE a.many_to_many_id = m.many_to_many_id AND a.foreign_key_id IN ( SELECT b.foreign_key_id FROM SampleTable b WHERE b.many_to_many_id = @search_id ) )
AND NOT EXISTS ( SELECT 1 FROM SampleTable a WHERE a.many_to_many_id = m.many_to_many_id AND a.foreign_key_id NOT IN ( SELECT b.foreign_key_id FROM SampleTable b WHERE b.many_to_many_id = @search_id ) )
GROUP BY m.many_to_many_id

SQL Fiddle Here