SQL一对多表分组

时间:2014-10-23 16:42:25

标签: sql group-by one-to-many

让我们考虑一下示例:我有以下表格 - TableA包含人员,TableB包含这些人的语言技能。描述person的每一行在TableB中都可以没有,一行或多行。示例如下:

People
+-----+--------+
| pId |  Name  |
+-----+--------+
|   0 | Thomas |
|   1 | Henry  |
|   2 | John   |
+-----+--------+

Skills
+-----+-----+----------+---------------+
| lID | pId | Language | LanguageSkill |
+-----+-----+----------+---------------+
|   0 |   0 | Dutch    |             0 |
|   1 |   0 | French   |             4 |
|   2 |   0 | Italian  |             2 |
|   3 |   2 | Italian  |             2 |
+-----+-----+----------+---------------+

托马斯知道荷兰语,法语和意大利语,亨利不懂任何外语,约翰知道意大利语。

我想得到的是TableA中每个人最熟悉的语言:

+--------+----------+
|  Name  | Language |
+--------+----------+
| Thomas | French   |
| Henry  | NULL     |
| John   | Italian  |
+--------+----------+

我觉得这很容易,但不知道如何以简单的方式实现它。

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

您需要使用以下查询为每个人获取最佳语言:

SELECT pid, language
from TableB
group by pid
having languageskill = max(languageskill)

然后将其加入People表:

SELECT a.name, b.language
from TableA a
LEFT JOIN
(
  SELECT pid, language, languageskill
  from TableB
  group by pid
  having languageskill = max(languageskill)
) b
ON a.pid = b.pid

当然,如果这个人有“绑定”字样,这种方法不会超过一行。最好的语言,你会失去关于'捆绑'最好的语言。