ON条件返回多行的JOIN查询中的MYSQL优化

时间:2014-02-26 15:46:22

标签: php mysql sql join

我正在寻找从多个表中提取数据的最佳方法,其中每个表返回多行。

这是我目前得到的:

Array ( 
[0] => Array ([id] => 1 [0] => 1 [comment] => My first Iphone ! [1] => My first Iphone ! [name] => Seb [2] => Seb [type] => smartphone [3] => smartphone [cat] => Phone [4] => Phone [fields] => Brand [5] => Brand [value] => Apple [6] => Apple )

[1] => Array ([id] => 1 [0] => 1 [comment] => My first Iphone ! [1] => My first Iphone ! [name] => Seb [2] => Seb [type] => smartphone [3] => smartphone [cat] => Phone [4] => Phone [fields] => Model [5] => Model [value] => Apple [6] => Apple )

[2] => Array ( [id] => 1 [0] => 1 [comment] => My first Iphone ! [1] => My first Iphone ! [name] => Seb [2] => Seb [type] => smartphone [3] => smartphone [cat] => Phone [4] => Phone [fields] => Brand [5] => Brand [value] => Iphone 5S [6] => Iphone 5S )

[3] => Array ( [id] => 1 [0] => 1 [comment] => My first Iphone ! [1] => My first Iphone ! [name] => Seb [2] => Seb [type] => smartphone [3] => smartphone [cat] => Phone [4] => Phone [fields] => Model [5] => Model [value] => Iphone 5S [6] => Iphone 5S ) )

我得到4行,因为JOIN在表之间制作笛卡尔积,2个JOIN查询返回2个结果。

这是结构:

购买:

+----+--------------------------------------+----------+------+---------------------+--------+
| id | comment                              | pictures | user | date                | object |
+----+--------------------------------------+----------+------+---------------------+--------+
|  1 | Mon premier Iphone ! la classe ! :-p |     NULL |   18 | 2014-02-24 06:33:08 |      1 |
+----+--------------------------------------+----------+------+---------------------+--------+

物体

+----+------+---------------------+
| id | type | date                |
+----+------+---------------------+
|  1 |    1 | 2014-02-25 00:00:00 |
+----+------+---------------------+

object_type的

+----+------------+----------+
| id | name       | category |
+----+------------+----------+
|  1 | smartphone |        2 |
+----+------------+----------+

分类

+----+-------------+--------+
| id | name        | parent |
+----+-------------+--------+
|  1 | High-Tech   |   NULL |
|  2 | Téléphone   |      1 |
+----+-------------+--------+

object_type_fields

+----+---------+----------+
| id | name    | required |
+----+---------+----------+
|  1 | Marque  |        1 |
|  2 | Modèle  |        1 |
+----+---------+----------+

object_type_fields_type

+---------+----------+
| id_type | id_field |
+---------+----------+
|       1 |        1 |
|       1 |        2 |
+---------+----------+

fields_values

+----+-----------+-----------+
| id | id_fields | value     |
+----+-----------+-----------+
|  1 |         1 | Apple     |
|  2 |         2 | Iphone 5S |
|  3 |         1 | SAMSUNG   |
+----+-----------+-----------+

object_fields_values

+----+-----------+----------+
| id | id_object | id_value |
+----+-----------+----------+
|  1 |         1 |        1 |
|  2 |         1 |        2 |
+----+-----------+----------+

这是我的问题:

SELECT
                purchases.id,
                purchases.comment as "comment",
                users.name as "name",
                object_type.name as "type",
                category.name as "cat",
                object_type_fields.name as "fields",
                fields_values.value as "value"
            FROM purchases
                JOIN object ON purchases.object = object.id
                JOIN object_type ON object.type = object_type.id
                JOIN category ON object_type.category = category.id
                JOIN object_type_fields_type ON object_type.id = object_type_fields_type.id_type
                JOIN object_type_fields ON object_type_fields_type.id_field = object_type_fields.id
                JOIN object_fields_values ON object_fields_values.id_object = object.id
                JOIN fields_values ON fields_values.id = object_fields_values.id_value
                JOIN users ON users.id = purchases.user
            WHERE users.username = :username

以下是我最后想要的内容:

Array ( [0] => Array ([id] => 1 [0] => 1 [comment] => My first Iphone ! [1] => My first Iphone ! [name] => Seb [2] => Seb [type] => smartphone [3] => smartphone [cat] => Phone [4] => Phone [fields] => Array([Brand] => Apple,  [Model] => Iphone 5S )))

我读过here多个查询是一种方法(唯一的方法吗?)。

但是......这是我的问题:为第一个查询提供给我的每一行进行2次查询(获取字段并获取值)似乎不是非常有效...查询数量将会非常快速地增长关于第一次查询将返回的对象数...

我能看到的另一个解决方案是使用基于Mysql给我的数组的php重新构建一个数组。但是仍然......只有一个对象太多循环。

是否有MYSQL工具/功能/方式可以有效地获得我想要的东西?

我首先考虑在对象表中序列化[fields] =>值数组,但是当按值搜索数据时我会遇到相同的效率问题(例如)。

1 个答案:

答案 0 :(得分:0)

当你试图从MySQL获取一组php数组时,你无法直接得到你想要的东西。

你可以做的最好的事情就是使用concat_ws / group_concat在一行中获取值。

这样的事情: -

SELECT
    purchases.id,
    purchases.comment as "comment",
    users.name as "name",
    object_type.name as "type",
    category.name as "cat",
    GROUP_CONCAT(CONCAT_WS("|", object_type_fields.name,fields_values.value)) as "fieldvalue"
FROM purchases
    JOIN object ON purchases.object = object.id
    JOIN object_type ON object.type = object_type.id
    JOIN category ON object_type.category = category.id
    JOIN object_type_fields_type ON object_type.id = object_type_fields_type.id_type
    JOIN object_type_fields ON object_type_fields_type.id_field = object_type_fields.id
    JOIN object_fields_values ON object_fields_values.id_object = object.id
    JOIN fields_values ON fields_values.id = object_fields_values.id_value
    JOIN users ON users.id = purchases.user
WHERE users.username = :username
GROUP BY purchases.id,
    comment,
    name,
    type,
    cat
相关问题