【发布时间】:2012-07-05 21:37:29
【问题描述】:
我的 MySQL 表结构由两个类似如下的表组成:
UserId field1 field2
1 XXX YYY
2 ABC DDD
3 EEE FFF
.
.
.
n GGG DDD
UserId attribute
1 blah
1 adfadf
1 ddad
2 adff
3 adfa
3 sdff
.
.
.
z adss
表 1 每个 ID 只有 1 条记录。表 2 每个 id 有 M 条记录。表 1 和表 2 中的 id 是相关的。我的查询类似于以下内容:
SELECT
t1.`UserId`,
t1.`field1`,
t1.`field2`,
t2.`attribute`
FROM `table1` AS `t1`
LEFT JOIN `table2` AS `t2` ON `t1`.UserId = `t2`.UserId
WHERE t1.`UserId` = 3
查询返回以下内容:
3 EEE FFF adfa
3 EEE FFF sdff
我不想为每个返回重复记录。我想返回一行,比如
3 EEE FFF (adfa,sdff)
第 4 个字段是一个数据结构(数组?结果集?),它包含为给定用户 ID 返回的所有属性。
编辑::: 我看到许多涉及 CONCAT 的解决方案,将其转换为 CSV。有逗号的字段会不会搞砸?
【问题讨论】:
-
你用的是什么关系型数据库?MySQL?
-
抱歉忘了说。 MySQL
-
唯一可以存在于单个字段中的数据结构是原始数据类型。在这种情况下,您最终使用逗号分隔的字符串是有意义的。您不能在其中放置数组,也不能在其中嵌套数据集。正如您已经拥有的那样,关系数据库通过多行数据完成您想要的工作。在关系数据库中,将多个值聚合到一个字段中被认为是一种非常痛苦的反模式。它使以多种不同方式查询数据变得痛苦。如果我可能会问,为什么您需要将所有内容汇总到一行中?
-
@user974896 - 我想我可能不清楚。单独行上的单独值 =
good。将值组合成一个字段 =bad。当前结构是关系数据库中的正常最佳实践,我绝不会推荐 JSON_ENCODED 字符串选项。我的建议是根本不要这样做,除非你有特定的理由需要这样做。如果您确实有一个,我会很想知道它,因为我们可能会评论这种方法是否真的有用。而且通常尝试按照你的要求去做没有从长远来看是有帮助的。 -
@user974896 - 带有逗号的值被聚合到一个逗号分隔的列表中只是我说你应该不这样做的一个示例。