用于查找共享完全相同的一组值的对的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

装箱问题 - 确定给定范围的一组值的最佳分组

使用一个查询递增具有唯一约束的字段中的一组值,Postgres

用R中的组中的非NA字符替换一组值的NA [重复]

SQL 查询以查找具有相同列值的多行

MySQL 使用一组值插入表中

从具有相同 id 的一组值中选择最大值