MYSQL语句从n:n表中快速选择组

时间:2011-08-18 00:53:27

标签: mysql

我有一组n:n数据(例如,'程序员'和'语言'。程序员用许多语言编写代码,许多程序员都可以使用一种语言)。这个数据在表programmers_languages

如何快速选择使用所有语言编码的程序员?

如果这令人困惑,请提供更多信息:

使用C ++,Pascal和Ruby编写Jon代码。 Joe用C ++和Ruby编写代码。 Ruby和Pascal中的Moe代码。 Steve C ++和Pascal中的代码。

如果有问题的语言集是C ++和Pascal,我希望Jon和Steve能够从这个列表中找到。

请注意,此集的大小可能会非常大,因此我不想将表连接到自身n次。

2 个答案:

答案 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