gpt4 book ai didi

mysql - 不用 GroupConcat 将多行合并为一

转载 作者:行者123 更新时间:2023-11-29 00:42:33 27 4
gpt4 key购买 nike

如何不使用group concat将多行合并为一行?

考虑我有如下表格:

表用户:

uid | name
-----------
1 | A
2 | B

表元:

uid | metaid | metaval
------------------------
1 | 1 | Jsep St.
1 | 2 | St. Oak No. 15
2 | 1 | Dt. San Joseph
2 | 2 | St. Oak No. 17
2 | 3 | OA.

表元属性:

metaid | metakey
-----------------
1 | school
2 | address
3 | dept
4 | acc

我想选择一个用户及其学校和地址,所以查询是

SELECT 
uid, name, metaval
FROM user
INNER JOIN meta ON meta.uid = user.uid
WHERE meta.metaid = 1 OR meta.metaid = 2

会输出

| UID | Name | MetaVal         |
--------------------------------
| 1 | A | Jsep St. |
| 1 | A | St. Oak No. 15 |

我想要的结果是这样的

uid | name | school  |    address 
-------------------------------------
1 | A | Jsep St.| St. Oak No. 15

使用 group concat,值为“school”和“address”的元属性不在不同的列中,而是在一列

我尝试加入两次并且它有效,但我认为它不优雅

SELECT 
uid, name, T1.metaval as school, T2.metaval as address
FROM user
INNER JOIN meta T1 ON T1.uid = user.uid AND T1.metaid = 1
INNER JOIN meta T2 ON T2.uid = user.uid AND T2.metaid = 2

有更好的解决方案吗?

最佳答案

Any better solution ?

简答

没有。

中等长度的回答

您的查询存在一些问题。

  • 您忘记包含 user 表。
  • 格式化您的 SQL 以使其易于阅读。
  • 如果某些数据可能丢失,请考虑使用 LEFT JOIN

试试这个:

SELECT uid, name, T1.metaval AS school, T2.metaval AS address
FROM user
LEFT JOIN meta T1 ON T1.uid = user.uid AND T1.metaid = 1
LEFT JOIN meta T2 ON T2.uid = user.uid AND T2.metaid = 2

长答案

是的,那个查询很丑陋,但问题不在于查询,而在于数据库设计。您使用的设计名为 entity-attribute-value (EAV)。尽可能避免使用 EAV 设计!每当您使用 EAV 时,您的所有查询都会变成多个连接怪物。如果您可以将每个值存储在同一行的单独列中,那就容易多了。

当然,也有一些情况是必须使用EAV的。然后你只需要接受你的查询将是冗长的、难以阅读的、不优雅的和缓慢的。这是您为拥有灵活的架构所做的权衡。

关于mysql - 不用 GroupConcat 将多行合并为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com