首页 > 解决方案 > MySQL 查询以获取产品变体

问题描述

我正在尝试获取产品变体属性以显示在产品页面上。我想要以下输出:

颜色:红色(尺码:S、M)、绿色(尺码:S)

但我得到:

颜色:红色、绿色尺寸:S、M

这是我到目前为止的简化版本:

产品表
| 编号 |
-------------
| 1 |
| 1 |
| 1 |
变体表
| id |fk_product_id|
--------------------------
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
属性表
|fk_variant_id| 房产 | 价值 |
--------------------------------------
| 1 | 颜色 | 红色 |
| 1 | 尺寸 | 小号 |
| 2 | 颜色 | 绿色 |
| 2 | 尺寸 | 小号 |
| 3 | 颜色 | 红色 |
| 3 | 尺寸 | 中号 |
$stmt=$db->prepare('SELECT
    attribute.property AS property,
    GROUP_CONCAT(DISTINCT attribute.value) AS value
FROM product
INNER JOIN variant
    ON product.id=variant.fk_product_id
LEFT JOIN attribute
    ON variant.id=attribute.fk_variant_id
WHERE product_id=:product_id
GROUP BY attribute.property');

$stmt->bindParam(':product_id',$product_id);
$stmt->execute();
$query=$stmt->fetchAll();
foreach($query as $row){
  echo $row['property'].' '.$row['value'].'<br>';
}

最终游戏是这样的: 属性选择

标签: mysqlentity-attribute-value

解决方案


此查询应为您提供所需的结果。它有效地创建了每个属性 (colorsize) 的表,并将它们加入到产品和变体中。

SELECT p.id AS product, c.value AS color, GROUP_CONCAT(s.value) AS sizes
FROM product p
JOIN variant v ON v.fk_product_id = p.id
LEFT JOIN attribute c ON c.fk_variant_id = v.id AND c.property = 'color'
LEFT JOIN attribute s ON s.fk_variant_id = v.id AND s.property = 'size'
GROUP BY product, color

输出

product     color   sizes
1           green   S
1           red     S,M

dbfiddle 上的演示


推荐阅读