从4个表中选择所有信息,将它们合二为一

时间:2017-07-16 16:49:10

标签: php mysql

我有以下表格:

表:产品

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";

这是有效的,但是创建我之前描述的数组有很多代码。我认为有一种更简单的方法可以做到这一点。谁能给我一个例子/提示/无论如何?

1 个答案:

答案 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编入索引。但这不重要。