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

时间:2016-03-23 12:09:14

标签: mysql

我研究了这个问题(将多个子行组合成一行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值的Max / min,concat或hard编码。在我的例子中,根据where子句中的另一个id,从SQL查询中检索id。每个广告客户ID可以为零图像或10个。请看下面我想要实现的目标。如果有人认为它是重复的,请指出正确的答案?

Image of table and select

基本上,我有3个表,我加入1,使用连接的select查询,我的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上一行的所有图像。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果你没有必须在单独的字段中,你可以使用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;

答案 2 :(得分:0)

您可以使用以下查询 -

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;