我有以下表格:
表:产品
product_id | name
------------------------------
1 | apple iphone 7
2 | samsung galaxy s8
表: attribute_categories
attribute_category_id | name
------------------------------------------
1 | Fysical properties
2 | Color
表:属性
attribute_id | attribute_category_id | name
---------------------------------------------
1 | 1 | width
2 | 1 | height
3 | 1 | Weight
4 | 2 | Color
表: attribute_values
attribute_value_id | product_id | attribute_id | value
---------------------------------------------------------
1 | 1 | 1 | 8 cm
2 | 1 | 2 | 12 cm
3 | 1 | 3 | 0,125 kg
4 | 1 | 4 | blue
5 | 2 | 1 | 8 cm
6 | 2 | 2 | 10 cm
7 | 2 | 3 | 0,400 kg
8 | 2 | 4 | red
首先,我想在一个查询中选择所有信息(如果可能),并像这样表示:
Array(
[product_id] => 1
[name] => apple iphone 7
[attributes] => Array(
[0] => Array(
[name] => Fysical properties
[attributes] => Array(
[0] => Array(
[name] => width
[value] => 8 cm
)
[1] => Array(
[name] => height
[value] => 12 cm
)
[2] => Array(
[name] => weight
[value] => 0,125 kg
)
)
[1] => Array(
[name] => Color
[attributes] => Array(
[0] => Array(
[name] => color
[value] => blue
)
)
目前,我正在使用3个查询,但我认为一个查询可以正常运行。
首先,我正在从数据库中选择所有属性。
其次,我在PHP中创建了一些SQL代码,将所有属性都放在SQL代码中。
第三,我从数据库中选择所有attribute_categories。
第四,我从数据库中选择所有产品信息+ attribute_values。
我的代码:
foreach($attributes as $attribute){
// creating some SQL-code
$c .= "MAX(IF(a.name = '".$attribute['name']."', fa.value, NULL)) as '".$attribute['name']."',";
};
$q = "SELECT p.product_id AS product_id,
p.name AS product_name,
{$c}
a.attribute_category_id AS category_id
FROM products p
LEFT JOIN attribute_values fa ON p.product_id = fa.product_id
LEFT JOIN attributes a ON fa.attribute_id = a.attribute_id
GROUP BY p.product_id";
这是有效的,但是创建我之前描述的数组有很多代码。我认为有一种更简单的方法可以做到这一点。谁能给我一个例子/提示/无论如何?
答案 0 :(得分:2)
将产品信息提取到数组后
$product = ['product_id' => 1, 'name' => 'apple iphone 7'];
获取所有相关属性:
$stmt = $mysqli->prepare("
select
a.name as attr_name,
v.value,
c.attribute_category_id as cat_id,
c.name as cat_name
from attribute_values v
join attributes a using(attribute_id)
join attribute_categories c using(attribute_category_id)
where v.product_id = ?
");
$stmt->bind_param('i', $product['product_id']);
$stmt->execute();
$result = $stmt->get_result();
在获取行时根据需要创建数组:
$attributes = [];
while ($row = $result->fetch_assoc()) {
if (!array_key_exists($row['cat_id'], $attributes)) {
// init categorie
$attributes[$row['cat_id']] = [
'name' => $row['cat_name'],
'attributes' => []
];
}
$attributes[$row['cat_id']]['attributes'][] = [
'name' => $row['attr_name'],
'value' => $row['value']
];
}
将属性分配给产品数组:
$product['attributes'] = $attributes;
$product['attributes']
将由类别ID编入索引。但这不重要。