MYSQL语句快速select group from n :n table

标签 mysql

我有一个 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/

相关文章:

mysql - 通过命令行将某些列从 csv 导入到 mysql

c# - MySql .Net Connector 似乎将错误的类型返回给 DataTable

iphone - 如何在不进行任何解析的情况下从服务器检索数据?

php - 无法使用数组中的 where 子句选择数据

MySQL - 更新连接和增量

MySQL concat() 创建要在查询中使用的列名?

php - mysql在where条件下获取数据

mysql - 如何连接复合表

mysql - 在 mySQL 中平均总数

java - 在 Hibernate 中映射一对多关系?