我有一个cs购物车数据库,我试图选择所有产品的所有属性,问题是对于产品的每个单独属性,我的查询创建一个新行,我想要有一行对于将所有属性都列入列的每个产品。
这是我现在的询问:
SELECT a.product_id, b.variant, c.description, d.product_code
FROM cscart_product_features_values a
LEFT JOIN cscart_product_feature_variant_descriptions b ON a.variant_id = b.variant_id
LEFT JOIN cscart_product_features_descriptions c ON a.feature_id = c.feature_id
LEFT JOIN cscart_products d ON a.product_id = d.product_id
运行查询后,我得到以下结果:
product_id;"variant";"description";"product_code"
38;"1st";"Grade Level";"750"
38;"Math";"Subject Area";"750"
38;"Evan-Moor";"Publisher";"750"
etc next product
我想要的是:
product_id;"product_code";"Grade Level";"Subject Area";"Publisher"
38;"750";"1st";"Math";"Evan-Moor"
etc next product
我们只有3种类型的属性:成绩水平,学科领域和出版商。
任何想法如何改进我的查询并实现这一目标?即使将一个列中的所有3个属性连接起来,我也很高兴,用“,”分隔。
答案 0 :(得分:1)
这是一个使用GROUP BY和MAX(case表达式)的通用SQL解决方案,可以将3行转换为包含3列的单行。
SELECT
v.product_id
, p.product_code
, MAX(CASE WHEN fd.description = 'Grade Level' THEN vd.variant END) AS GradeLevel
, MAX(CASE WHEN fd.description = 'Subject Area' THEN vd.variant END) AS SubjectArea
, MAX(CASE WHEN fd.description = 'Publisher' THEN vd.variant END) AS Publisher
FROM cscart_products p
LEFT JOIN cscart_product_features_values v ON p.product_id = v.product_id
LEFT JOIN cscart_product_feature_variant_descriptions vd ON v.variant_id = vd.variant_id
LEFT JOIN cscart_product_features_descriptions fd ON v.feature_id = fd.feature_id
GROUP BY
v.product_id
, p.product_code
这种方法应该适用于任何SQL数据库。
另请注意,我已更改了表的顺序,因为我认为cscart_products中必须有一行,但其他表中可能没有相关的行。
我也更改了别名,我个人并不关心基于查询中使用顺序的别名(例如我只是改变了顺序,所以我不得不更改所有引用)。我用过' p' =产品,' v' =变种,' vd' =变体描述& ' FD' =功能描述' - 对于别名的这种约定,我可以在不改变每个引用的情况下重新排列查询。