我有一个 n:n 的数据集(例如,'程序员'和'语言'。程序员用多种语言编写代码,而一种语言可以被许多程序员使用)。此数据在表 programmers_languages 中
我如何快速选择使用一组语言编写代码的程序员?
如果这令人困惑,请提供更多信息:
Jon 使用 C++、Pascal 和 Ruby 编写代码。 Joe 使用 C++ 和 Ruby 编写代码。 Ruby 和 Pascal 中的萌代码。 Steve 使用 C++ 和 Pascal 编写代码。
如果所讨论的语言集是 C++ 和 Pascal,我希望 Jon 和 Steve 不在这个列表中。
请注意,这个集合的大小可能会变得非常大,所以我不想将表与其自身连接 n 次。
最佳答案
Note the size of this set can get pretty large, so I don't want to join the table to itself n times.
无论您如何摇动它,每种语言都会有一个连接。您正在寻找一个值(程序员),其中每个值(语言)至少存在一行。这意味着您需要考虑同一张表的 N 个不同视角。
在大多数情况下,对您来说,只进行连接可能是最有效的。如果结果集足够密集(实际上,大多数程序员都说 python 和 c++),您可以求助于一些小聪明。首先查询析取,但唯一查询,然后按程序员对结果关系进行分组,并过滤掉说太少语言的关系...
SELECT programmer
FROM ( SELECT DISTINCT programmer, language
FROM speaks_table
WHERE language in ('C++', 'python') ) AS disjunction
GROUP BY disjunction.programmer
HAVING count(disjunction.language) = 2
但这是否优于常规的 ol' 多路连接将取决于所讨论的确切数据。这至少有一个优点,即不需要根据所讨论语言的数量进行生成查询。
关于MYSQL语句快速select group from n :n table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101212/