[英]Combine Multiple child rows into one row MYSQL without hardcoding or min/max values
我确实研究了这个问题(将多个子行合并为一行MYSQL),但没有一个与我的相同。 我需要一个解决方案,但没有任何条件。 我看到了数据透视表示例,但是它们都使用条件或硬编码,例如,请参见以下内容:
GROUP_CONCAT(if(colID = 1, value, NULL))
OR
Round(Sum(If( Month(o.orderdate)= 1, (d.unitprice*d.quantity)-d.discount, 0 )), 2 ) AS Jan,
它们都使用最大/最小,连续或ID值的硬编码。 在我的情况下,根据where子句中的另一个ID从SQL查询中检索ID。 每个广告客户ID可以有0张图片或10张图片。 请查看下面的图片,了解我要实现的目标。 如果有人觉得它是重复的,请给我指出正确的答案?
基本上,我有3个表,要联接成1个表,使用联接的选择查询,我的MySQL在下面:
select a.PK , a.Name, a.Email, i.Image_Name
FROM `advertiser` a
LEFT JOIN category c ON a.PK = c. FK
LEFT JOIN images I on a.PK = i.FK
where c.FK = 1
现在,我的结果是这样的:
PK Name Email Image_name
31 Sprouts info@Sprout.co.za Sprouts.jpg
31 Sprouts info@Sprout.co.za Bananas.jpg
31 Sprouts info@Sprout.co.za Apples.jpg
31 Sprouts info@Sprout.co.za Lemos.jpg
我想要的是:
PK Name Email Image_name_1 Image_name_2 Image_name_3 Image_name_4
31 Sprouts info@Sprout.co.za Sprouts.jpg Bananas.jpg Apples.jpg Lemos.jpg
每个PK一行上所有图像。
任何帮助将不胜感激。
GROUP_CONCAT()
可能是今年完成此项目的最佳选择。 如果您的图片数量上限为10张,则可能效果很好。 如果您尝试连接数百个项目,它会陷入困境。
此查询值得尝试。
select a.PK , a.Name, a.Email,
GROUP_CONCAT(DISTINCT i.Image_Name SEPARATOR '|') Image_Names
FROM `advertiser` a
LEFT JOIN category c ON a.PK = c. FK
LEFT JOIN images I on a.PK = i.FK
where c.FK = 1
GROUP BY a.PK, a.Name, a.Email
如果您不必在分隔字段中使用,则可以使用GROUP_CONCAT:
select a.PK , a.Name, a.Email, GROUP_CONCAT(i.Image_Name) AS Images
FROM `advertiser` a
LEFT JOIN category c ON a.PK = c. FK
LEFT JOIN images I on a.PK = i.FK
where c.FK = 1
group by a.PK;
您可以在下面的查询中使用-
SELECT a.PK , a.Name, a.Email,
SUBSTRING_INDEX(GROUP_CONCAT(i.Image_Name),',',1) AS Image_name_1,
IF((LENGTH(GROUP_CONCAT(i.Image_Name)) - LENGTH(GROUP_CONCAT(i.Image_Name SEPARATOR ''))) < 1,'',SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(i.Image_Name),',',2),',',-1)) AS Image_name_2,
IF((LENGTH(GROUP_CONCAT(i.Image_Name)) - LENGTH(GROUP_CONCAT(i.Image_Name SEPARATOR ''))) < 2,'',SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(i.Image_Name),',',3),',',-1),',',-1)) AS Image_name_3,
IF((LENGTH(GROUP_CONCAT(i.Image_Name)) - LENGTH(GROUP_CONCAT(i.Image_Name SEPARATOR ''))) < 3,'',SUBSTRING_INDEX(GROUP_CONCAT(i.Image_Name),',',-1)) AS Image_name_4
FROM `advertiser` a
LEFT JOIN category c ON a.PK = c. FK
LEFT JOIN images I ON a.PK = i.FK
WHERE c.FK = 1
GROUP BY a.PK, a.Name,a.Email;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.