我需要一些帮助来组合一个sql查询,该查询将提供以下结果集:
alt text http://www.freeimagehosting.net/uploads/7991d3bdd3.png

alt text http://www.freeimagehosting.net/uploads/39135e4196.png
数据模型如下所示:
alt text http://www.freeimagehosting.net/uploads/bff4321b54.png
对我来说棘手的部分是,resultset中“product”右边的列实际上不是数据库中的列,而是横跨数据模型的键/值对。
表数据如下:
alt text http://www.freeimagehosting.net/uploads/e3b1a1c80c.png
alt text http://www.freeimagehosting.net/uploads/cbb473d1af.png
alt text http://www.freeimagehosting.net/uploads/8c07b6d1d6.png
alt text http://www.freeimagehosting.net/uploads/45a322a155.png
我为图像质量问题和图像质量预先道歉。这似乎是传达信息的最简单的方式。编写查询语句以获得结果所需的时间可能比编写此问题所需的时间要短。
顺便说一下,“product_option”表图像被截断了,但它说明了数据结构的一般思想。
mysql服务器版本是5.1.45。

最佳答案

它们都是标准的透视查询,但由于列标题的不同,它们必须是独立的,并且其中一个列比另一个列多。
问题1:

   SELECT p.name AS product,
          MAX(CASE WHEN o.name = 'Brand' THEN po.value ELSE NULL END) AS Brand,
          MAX(CASE WHEN o.name = 'Size' THEN po.value ELSE NULL END) AS Size,
          MAX(CASE WHEN o.name = 'Color' THEN po.value ELSE NULL END) AS Color,
          MAX(CASE WHEN o.name = 'Material' THEN po.value ELSE NULL END) AS Material,
          MAX(CASE WHEN o.name = 'Sole' THEN po.value ELSE NULL END) AS Sole
     FROM PRODUCT p
     JOIN CATEGORY c ON c.category_id = p.category_id
                    AND c.name = 'shoe'
LEFT JOIN PRODUCT_OPTION po ON po.product_id = p.product_id
LEFT JOIN OPTION o ON o.option_id = po.option_id
 GROUP BY p.name

问题2:
   SELECT p.name AS product,
          MAX(CASE WHEN o.name = 'Make' THEN po.value ELSE NULL END) AS Make,
          MAX(CASE WHEN o.name = 'Model' THEN po.value ELSE NULL END) AS Model,
          MAX(CASE WHEN o.name = 'Color' THEN po.value ELSE NULL END) AS Color,
          MAX(CASE WHEN o.name = 'Doors' THEN po.value ELSE NULL END) AS Doors
     FROM PRODUCT p
     JOIN CATEGORY c ON c.category_id = p.category_id
                    AND c.name = 'car'
LEFT JOIN PRODUCT_OPTION po ON po.product_id = p.product_id
LEFT JOIN OPTION o ON o.option_id = po.option_id
 GROUP BY p.name

09-15 17:52