小编典典

将一行连接到另一张表中的多行

sql

我有一个表,其中包含实体(让他们称为人)和属性(一个人可以具有任意数量的属性)。前任:

人们

Name  Age
--------
Jane  27
Joe   36
Jim   16

特性

Name   Property
-----------------
Jane   Smart
Jane   Funny
Jane   Good-looking
Joe    Smart
Joe    Workaholic
Jim    Funny
Jim    Young

我想写一个有效的选择,该选择将根据年龄选择人并返回他们全部或部分财产。

Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

返回属性之一和属性总数也可以接受。

查询应该是有效的:人员表中有数百万行,属性表中有数十万行(因此大多数人没有属性)。一次选择了数百行。

有什么办法吗?


阅读 198

收藏
2021-03-17

共1个答案

小编典典

使用:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

您需要MySQL函数GROUP_CONCAT(documentation),以便返回用逗号分隔的PROPERTIES.property值列表。

我使用LEFT JOIN而不是JOIN来包括在PROPERTIES表中不包含值的PEOPLE记录-
如果您只希望在PROPERTIES表中包含具有值的人的列表,请使用:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
     JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

我意识到这是一个示例,但是考虑到“约翰·史密斯”有多少个名字,使用名字对参考完整性来说是一个糟糕的选择。分配user_id(每个用户的唯一值)将是一个更好的选择。

2021-03-17