gpt4 book ai didi

MySQL 合并列

转载 作者:行者123 更新时间:2023-11-29 20:20:08 25 4
gpt4 key购买 nike

我有两个相互引用的表。第一个表是位置。

id      title   
------ --------
001 a
002 b
003 c
004 d
005 e

第二个表是单位。

id      status  info        
------ ------ ------------
001 s manager
001 o head manag
002 s programmer
003 s programmer

在状态字段中,“s”表示 header ,“o”表示正文。我尝试过左连接,但没有成功。

SELECT a.id, a.title, 
(CASE WHEN b.status = 's' THEN b.info END) AS header,
(CASE WHEN b.status = 'o' THEN b.info END) AS body
FROM
POSITION a LEFT JOIN
unit b
ON a.id = b.id

结果是

id      title   header      body        
------ ------ ---------- ------------
001 a manager (NULL)
001 a (NULL) head manag
002 b programmer (NULL)
003 c programmer (NULL)

我想知道结果是这样的

id      title   header      body        
------ ------ ---------- ------------
001 a manager head manag
002 b programmer (NULL)
003 c programmer (NULL)

提前致谢。

最佳答案

您需要按 id 进行分组。并且您需要一个用于状态列的聚合函数(例如 MIN()MAX())。

SELECT a.id, a.title, 
MIN(CASE WHEN b.status = 's' THEN b.info END) AS header,
MIN(CASE WHEN b.status = 'o' THEN b.info END) AS body
FROM
POSITION a LEFT JOIN
unit b
ON a.id = b.id
GROUP BY a.id

sqlfiddle

更新:

让我们获取原始结果而不进行聚合,但将其限制为 id = 001

id      title   header      body        
------ ------ ---------- ------------
001 a manager (NULL)
001 a (NULL) head manag

现在,如果您按 id 对结果进行分组 (GROUP BY a.id) 但不使用任何聚合函数,MySQL 可以自由地从未在列表中列出的列中选择任何值* GROUP BY 子句。这对于 title 列**来说不是问题,因为它应该始终相同。但对于 headerbody 列,MySQL 可能会选择 NULL。使用MIN(...)我们告诉MySQL选择NOT NULL的“最小”值(如果只存在NULL“值”则选择NULL)。使用 MIN()MAX() 并不重要,因为应该只有一个非空值,并且结果是相同的。

hedaer:
MIN('manager', NULL) = 'manager'
MAX('manager', NULL) = 'manager'

body:
MIN(NULL, 'head manag') = 'head manag'
MAX(NULL, 'head manag') = 'head manag'

<小时/>* 事实上它会选择第一个值。但这是一个实现问题,这种行为将来可能会改变。

** 在严格模式下,您甚至不允许选择 title,因为它未在 GROUP BY 子句中列出。因此,您要么需要使用聚合函数 (MIN(a.title)),要么将其列在 GROUP BY 子句中 (GROUP BY a.id, a.title )。

关于MySQL 合并列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546758/

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