SELECT语句,用于一行中的一对多所有详细信息

时间:2010-02-21 07:01:23

标签: mysql sql select

有两个表:

产品
ID(主键),
ProductName

PlannedByMonths
ProductID(主键)(多对一链接到Products表),
MonthNumber(主键),
QtytoProduce

如何编写SELECT语句以检索以下格式的结果?

ProductName, QtytoProduceMonth1, QtytoProduceMonth2, QtytoProduceMonth3, QtytoProduceMonth4, QtytoProduceMonth5, QtytoProduceMonth6, QtytoProduceMonth7, QtytoProduceMonth8, QtytoProduceMonth9, QtytoProduceMonth10, QtytoProduceMonth11, QtytoProduceMonth12

4 个答案:

答案 0 :(得分:1)

我仍然不确定这不是自电视晚宴以来最糟糕的技术进步,但从第4.1节开始MySQL具有GROUP_CONCAT()功能,可以满足您的需求:

  SELECT p.ProductName
         , group_concat(pbm.QtytoProduce order by pbm.MonthNumber)
    FROM Products p
         INNER JOIN PlannedByMonths pbm
         ON p.ID = pbm.ProductID
GROUP BY p.prodname

这会为包含以下内容的每个ProductName返回一行:

  1. ProductName
  2. BLOB中每个QtytoProduce的{​​{1}}。

答案 1 :(得分:1)

我不知道在MySQL中是否有更简单的转轴方式,但这应该有效:

        select 
        (select descriptions from products d where d.productid = p.productid )
           description,
         max(if(month=1,Qty, null)) m1,
         max(if(month=2, Qty,null)) m2,
         max(if(month=3, Qty, null)) m3 
         /* more here */
         from Planned p 
         group by productid  ;

答案 2 :(得分:0)

你需要12个连接:

select ProductName, pbm1.QtytoProduce, pbm2.QtytoProduce, pbm3.QtytoProduce, pbm4.QtytoProduce, pbm5.QtytoProduce, pbm6.QtytoProduce, pbm7.QtytoProduce, pbm8.QtytoProduce, pbm9.QtytoProduce, pbm10.QtytoProduce, pbm11.QtytoProduce, pbm12.QtytoProduce from Products p
left join PlannedByMonths pbm1 on p.ID=pbm1.ProductID and pbm1.MonthNumber=1
left join PlannedByMonths pbm1 on p.ID=pbm2.ProductID and pbm2.MonthNumber=2
left join PlannedByMonths pbm1 on p.ID=pbm3.ProductID and pbm3.MonthNumber=3
left join PlannedByMonths pbm1 on p.ID=pbm4.ProductID and pbm4.MonthNumber=4
left join PlannedByMonths pbm1 on p.ID=pbm5.ProductID and pbm5.MonthNumber=5
left join PlannedByMonths pbm1 on p.ID=pbm6.ProductID and pbm6.MonthNumber=6
left join PlannedByMonths pbm1 on p.ID=pbm7.ProductID and pbm7.MonthNumber=7
left join PlannedByMonths pbm1 on p.ID=pbm8.ProductID and pbm8.MonthNumber=8
left join PlannedByMonths pbm1 on p.ID=pbm9.ProductID and pbm9.MonthNumber=9
left join PlannedByMonths pbm1 on p.ID=pbm10.ProductID and pbm10.MonthNumber=10
left join PlannedByMonths pbm1 on p.ID=pbm11.ProductID and pbm11.MonthNumber=11
left join PlannedByMonths pbm1 on p.ID=pbm12.ProductID and pbm12.MonthNumber=12

答案 3 :(得分:0)

不要那样做。

将您的业务逻辑放在查询之外。 将业务逻辑表单查询移动到代码。

查询中的业务逻辑难以维护,难以扩展并且为您提供了很少的操作机会。 如果您喜欢将复杂的业务逻辑放入db层使用存储过程。 否则使用代码来制作业务逻辑。

问候

相关问题