我有一个包含实体(让我们称它们为人)和属性(一个人可以拥有任意数量的属性)的表.例如:

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

我想写一个有效的 Select ,将 Select 基于年龄的人,并返回他们的全部或部分财产.

Ex: 人 older than 26
Name 属性
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

返回其中一个属性和总属性计数也是可以接受的.

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

有什么办法吗?

推荐答案

使用:

   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函数组_CONCAT(documentation)返回以逗号分隔的属性列表.财产价值.

我使用左连接而不是连接是为了包括在属性表中没有值的人员记录-如果您只需要在属性表中具有值的人员列表,请使用:

   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

我知道这是一个例子,但当你考虑到有多少个"John Smith"时,使用名字是一个糟糕的参考完整性 Select . for each 用户分配一个唯一值user_id会是更好的 Select .

Database相关问答推荐

即使将enable_seqscan设置为关闭,也未使用数组列上的 GIN 索引?

我应该使用哪种数据库模型在运行时动态修改实体/属性?

管理数据库中的产品计数

什么技术对处理数百万条记录最有效?

Symfony2:spl_object_hash() expects parameter 1 to be object, string given in Doctrine

库存数据库的最佳 struct

将 `tsv` 文件插入 postgresql 数据库

如何在sqlite数据库中添加日期

The method setListAdapter(ArrayAdapter) is undefined for the type create

如何在 MySQL 中强制执行唯一约束?

friendship数据库模式

SQL 中的 CAST 和 CONVERT 是否相同?

不带 WHERE 子句的 UPDATE 查询

如何配置 NLog 以写入数据库?

SQL - 如何转置?

多个和单个索引

xampp phpmyadmin,格式参数不正确

如何安装/更新到 Postgres 9.4?

列的 SQL Server 2008 千位分隔符

是否有用于 postgresql 的数据可视化工具,它也能够显示模式间关系?