繁体   English   中英

将多个子行合并为一行MYSQL,而无需硬编码或最小值/最大值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM