我有一组n:n数据(例如,'程序员'和'语言'。程序员用许多语言编写代码,许多程序员都可以使用一种语言)。这个数据在表programmers_languages
中如何快速选择使用所有语言编码的程序员?
如果这令人困惑,请提供更多信息:
使用C ++,Pascal和Ruby编写Jon代码。 Joe用C ++和Ruby编写代码。 Ruby和Pascal中的Moe代码。 Steve C ++和Pascal中的代码。
如果有问题的语言集是C ++和Pascal,我希望Jon和Steve能够从这个列表中找到。
请注意,此集的大小可能会非常大,因此我不想将表连接到自身n次。
答案 0 :(得分:4)
请注意,此集的大小可能会非常大,因此我不想将表连接到自身n次。
任何你摇动它的方式,每种语言都会有一个联接。您正在寻找一个值(程序员),其中每个另一个值(语言)至少存在一行。这意味着您需要考虑同一个表的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
但是,它的表现优于常规的'多路连接将取决于所涉及的确切数据。这至少具有不需要生成查询的优点,具体取决于所讨论的语言数量。
答案 1 :(得分:-1)
修改:这是我的第一个答案,并不适用于这个问题。
假设表Programmers_Languages
有两个VARCHAR
列,一个名为Programmer
,另一个名为Languages
:
SELECT DISTINCT Programmer
FROM Programmers_Languages
WHERE Language IN ('C++', 'Pascal')
ORDER BY Programmer
DISTINCT
以便您只获得一次结果。 ORDER BY
如果您希望按字母顺序排序。
修改:不同的查询,这有效。
SELECT Programmers
FROM Programmers_Languages
WHERE Languages IN ('C++', 'Pascal')
GROUP BY Programmers
HAVING COUNT(*) >= 2
ORDER BY Programmers
看起来TokenMacGuy提出了非常相似的东西。我假设语言列表和语言数将被其他一些代码插入此查询中。如果您正在动态构建查询,那么以下内容会更快:
SELECT DISTINCT Programmers
FROM Programmers_Languages
WHERE Languages = 'C++'
AND Languages = 'Pascal'
AND <...>
ORDER BY Programmers