MySQL 查询以获取产品变体

Posted

技术标签:

【中文标题】MySQL 查询以获取产品变体【英文标题】:MySQL query to fetch product variants 【发布时间】:2018-12-10 12:21:20 【问题描述】:

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

颜色:红色(尺码: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>';

最终游戏是这样的:

【问题讨论】:

就我个人而言,我无法真正理解在 php 解析查询中包含 GROUP_CONCAT 子句的意义。 【参考方案1】:

这个查询应该会给你想要的结果。它有效地创建每个属性的表(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

Demo on dbfiddle

【讨论】:

谢谢!这完美无缺。而且,我学到了一些新东西。 :)

以上是关于MySQL 查询以获取产品变体的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询以获取列中每个元素的计数

MySql过滤查询到产品变体表[重复]

获取产品变体描述以显示在 woocommerce 中的订单项目上?

mysql 变体到来自 sql 查询的列

MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询

查询以获取上周销售额最高的产品获得者