MySQL 使用 IN 子句将行合并为一个
MySQL Combine rows into one with IN clause
我想根据下面的查询将值合并为一行,但尽管使用了 GROUP_CONCAT,但我得到了两个单独的行。
SELECT
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id ASC SEPARATOR ',') AS rd_id,
GROUP_CONCAT(DISTINCT d.length ORDER BY d.length ASC SEPARATOR ',') AS rd_length,
GROUP_CONCAT(DISTINCT c.id ORDER BY c.id ASC SEPARATOR ',') AS rc_id,
GROUP_CONCAT(DISTINCT c.length ORDER BY c.length ASC SEPARATOR ',') AS rc_length,
GROUP_CONCAT(DISTINCT d.name ORDER BY d.name ASC SEPARATOR ',') AS rd_name,
GROUP_CONCAT(DISTINCT c.title ORDER BY c.title ASC SEPARATOR ',') AS rc_name,
GROUP_CONCAT(DISTINCT s1.id ORDER BY s1.id ASC SEPARATOR ',') AS rd_staff_id,
GROUP_CONCAT(DISTINCT s2.id ORDER BY s2.id ASC SEPARATOR ',') AS rc_staff_id,
GROUP_CONCAT(DISTINCT s1.title ORDER BY s1.title ASC SEPARATOR ',') AS rd_staff_name,
GROUP_CONCAT(DISTINCT s2.title ORDER BY s2.title ASC SEPARATOR ',') AS rc_staff_name
FROM rec r
LEFT JOIN dis d ON d.id = r.dis_id
LEFT JOIN covs c ON c.id = r.cov_id
LEFT JOIN staff s1 ON FIND_IN_SET(d.id, s1.dis)
LEFT JOIN staff s2 ON FIND_IN_SET(c.id, s2.covs)
WHERE r.sid = 8
AND r.id IN (11298,11299)
GROUP BY r.id;
结果为
rd_id rd_length rc_id rc_length rd_name rc_name rd_staff_id rc_staff_id rd_staff_name rc_staff_name
26 10 NULL NULL DAC NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
18 10 NULL NULL APS NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
我要的是这个,
rd_id rd_length rc_id rc_length rd_name rc_name rd_staff_id rc_staff_id rd_staff_name rc_staff_name
26,18 10,10 NULL NULL DAC, APS NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
r.id
11298,11299
是一个动态参数,需要保持组合。我得到的结果集将它分成两行,而不是将它保留为一个,这样会在之后破坏其余的逻辑。
任何 ideas/suggestions 将不胜感激。
非常感谢!
GROUP BY r.id
使您每 rec.id 获得一行。如果您只需要一行,只需删除 GROUP BY。每当 select 字段包含 GROUP_CONCAT 等聚合函数且没有 GROUP BY 时,所有行都分组在一起。
然而,这将产生 10
的 rd_length,而不是 10,10
。如果希望 non-distinct 值出现多次,需要去掉 DISTINCT。如果您希望它们仅在出现不同 rec.id 时出现,那么您可能需要将现有查询变成子查询并从中执行 select group_concat(rd_length) as rd_length, ....
。
我想根据下面的查询将值合并为一行,但尽管使用了 GROUP_CONCAT,但我得到了两个单独的行。
SELECT
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id ASC SEPARATOR ',') AS rd_id,
GROUP_CONCAT(DISTINCT d.length ORDER BY d.length ASC SEPARATOR ',') AS rd_length,
GROUP_CONCAT(DISTINCT c.id ORDER BY c.id ASC SEPARATOR ',') AS rc_id,
GROUP_CONCAT(DISTINCT c.length ORDER BY c.length ASC SEPARATOR ',') AS rc_length,
GROUP_CONCAT(DISTINCT d.name ORDER BY d.name ASC SEPARATOR ',') AS rd_name,
GROUP_CONCAT(DISTINCT c.title ORDER BY c.title ASC SEPARATOR ',') AS rc_name,
GROUP_CONCAT(DISTINCT s1.id ORDER BY s1.id ASC SEPARATOR ',') AS rd_staff_id,
GROUP_CONCAT(DISTINCT s2.id ORDER BY s2.id ASC SEPARATOR ',') AS rc_staff_id,
GROUP_CONCAT(DISTINCT s1.title ORDER BY s1.title ASC SEPARATOR ',') AS rd_staff_name,
GROUP_CONCAT(DISTINCT s2.title ORDER BY s2.title ASC SEPARATOR ',') AS rc_staff_name
FROM rec r
LEFT JOIN dis d ON d.id = r.dis_id
LEFT JOIN covs c ON c.id = r.cov_id
LEFT JOIN staff s1 ON FIND_IN_SET(d.id, s1.dis)
LEFT JOIN staff s2 ON FIND_IN_SET(c.id, s2.covs)
WHERE r.sid = 8
AND r.id IN (11298,11299)
GROUP BY r.id;
结果为
rd_id rd_length rc_id rc_length rd_name rc_name rd_staff_id rc_staff_id rd_staff_name rc_staff_name
26 10 NULL NULL DAC NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
18 10 NULL NULL APS NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
我要的是这个,
rd_id rd_length rc_id rc_length rd_name rc_name rd_staff_id rc_staff_id rd_staff_name rc_staff_name
26,18 10,10 NULL NULL DAC, APS NULL 74,84,88 NULL Ellie,Eve,Vicki NULL
r.id
11298,11299
是一个动态参数,需要保持组合。我得到的结果集将它分成两行,而不是将它保留为一个,这样会在之后破坏其余的逻辑。
任何 ideas/suggestions 将不胜感激。
非常感谢!
GROUP BY r.id
使您每 rec.id 获得一行。如果您只需要一行,只需删除 GROUP BY。每当 select 字段包含 GROUP_CONCAT 等聚合函数且没有 GROUP BY 时,所有行都分组在一起。
然而,这将产生 10
的 rd_length,而不是 10,10
。如果希望 non-distinct 值出现多次,需要去掉 DISTINCT。如果您希望它们仅在出现不同 rec.id 时出现,那么您可能需要将现有查询变成子查询并从中执行 select group_concat(rd_length) as rd_length, ....
。