用于查找共享完全相同的一组值的对的 SQL 查询
Posted
技术标签:
【中文标题】用于查找共享完全相同的一组值的对的 SQL 查询【英文标题】:SQL query for finding pairs that share the exact same set of values 【发布时间】:2013-07-11 19:31:45 【问题描述】:我无法为这个问题生成查询。
我有这张小桌子
Tasks(employee_name, task)
Sample Data:
Tasks
------------------
Joe | taskA
Joe | taskB
Ted | taskA
Jim | taskB
Ray | taskA
Ray | taskB
John| taskA
Tim | taskC
我需要找到所有具有完全相同任务的员工对。
例如使用上面的数据结果集应该是:
---------------------
employee1 | employee2
---------------------
Joe | Ray
Ted | John
我正在为数据库使用 mysql。 谢谢!
【问题讨论】:
好吧,这只是一个疯狂的建议,但也许你可以尝试在桌子和它自己之间使用join
,就好像它是另一张桌子一样?
【参考方案1】:
select a.employee_name,b.employee_name
from tasks as a, tasks as b
where a.employee_name>b.employee_name
group by a.employee_name,b.employee_name
having group_concat(distinct a.task order by a.task)=group_concat(distinct b.task order by b.task)
【讨论】:
+1 如果您将 GROUP_CONCAT() 术语移动到 HAVING 子句中。您不能在 WHERE 子句中执行分组功能。 太棒了!从来不知道 group_concat() 函数。那正是我被卡住的地方。谢谢! :)【参考方案2】:将表加入到自身中,选择一个大于另一个的employee_name,并且任务相同。
select emp1.employee_name, emp2.employee_name, emp1.task
from tasks emp1
inner join task emp2
on emp1.employee_name > emp2.employee_name
and emp1.task = emp2.task
希望你有一个真正的 PK,或者这只是一个示例练习。这在生产环境中并不好,因为在大多数公司/系统中,employee_name 不会唯一标识员工。
【讨论】:
这仅表示两名员工至少共享一项共同任务。要求是所有任务都是等效的。以上是关于用于查找共享完全相同的一组值的对的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章