MySQL透视与左连接

bxjv4tth  于 2022-10-31  发布在  Mysql
关注(0)|答案(2)|浏览(115)

产品名称
| 产品标识|产品名称|
| - -|- -|
| 10个|橙子|
| 十一|苹果公司|
| 十二个|胡萝卜|
| 十三个|生菜|
类别
| 目录ID|目录名|
| - -|- -|
| 20个|水果类|
| 二十一个|蔬菜类|
项目名称
| 项目标识|属性类型|属性值|
| - -|- -|- -|
| 30个|fk_产品标识|10个|
| 30个|fk类别标识|20个|
| 三十一个|fk_产品标识|十一|
| 三十一个|fk类别标识|20个|
| 三十二个|fk_产品标识|十二个|
| 三十二个|fk类别标识|二十一个|
我尝试透视Item,然后将其与Product和Category进行左联接,以获得:
| 项目标识|fk_产品标识|fk类别标识|产品名称|目录名|
| - -|- -|- -|- -|- -|
| 30个|10个|20个|橙子|水果类|
| 三十一个|十一|20个|苹果公司|水果类|
| 三十二个|十二个|二十一个|胡萝卜|蔬菜类|
不幸的是:

SELECT
    item_id,
    MAX(CASE WHEN property_type = 'fk_prod_id' THEN property_value END) AS fk_prod_id,
    MAX(CASE WHEN property_type = 'fk_cat_id' THEN property_value END) AS fk_cat_id
FROM item AS i
LEFT JOIN product AS p ON p.prod_id = fk_prod_id
LEFT JOIN category AS c ON c.cat_id = fk_cat_id
GROUP BY item_id;

#Error Code: 1054. Unknown column 'fk_prod_id' in 'on clause'
在上述情况下,如何在数据透视表之后左联接其他表?

e5nqia27

e5nqia271#

如果(item_id, property_type)被定义为UNIQUE(这是合理的),那么连接2个Item表副本会更简单,甚至可能更快:

SELECT item_id, 
       i1.property_value fk_prod_id, 
       i2.property_value fk_cat_id, 
       p.prod_name, 
       c.cat_name
FROM Item i1
JOIN Item i2 USING (item_id)
JOIN Product p ON p.prod_id = i1.property_value
JOIN Category c ON c.cat_id = i2.property_value
WHERE i1.property_type = 'fk_prod_id'
  AND i2.property_type = 'fk_cat_id'
xt0899hw

xt0899hw2#

SELECT
    item_id,
    fk_prod_id,
    fk_cat_id,
    prod_name,
    cat_name
FROM (
    SELECT
        item_id,
        MAX(CASE WHEN property_type = 'fk_prod_id' THEN property_value END) AS fk_prod_id,
        MAX(CASE WHEN property_type = 'fk_cat_id' THEN property_value END) AS fk_cat_id
    FROM item AS i
    GROUP BY item_id
) AS t1 
LEFT JOIN product AS p ON p.prod_id = t1.fk_prod_id
LEFT JOIN category AS c ON c.cat_id = t1.fk_cat_id;

相关问题