php - MYSQL 优化 JOIN 查询中 ON 条件返回多行的情况

标签 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 ) )

由于 JOIN 在表之间生成笛卡尔积,并且 2 个 JOIN 查询各返回 2 个结果,因此我得到了 4 行。

结构如下:

购买:

+----+--------------------------------------+----------+------+---------------------+--------+
| 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 |
+----+------+---------------------+

对象类型

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

类别

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

对象类型字段

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

对象类型字段类型

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

字段值

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

对象字段值

+----+-----------+----------+
| 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]=>value 数组,但是当按值搜索数据时(例如),我会遇到同样的效率问题。

最佳答案

你不能直接得到你想要的,因为你试图从 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

关于php - MYSQL 优化 JOIN 查询中 ON 条件返回多行的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22046344/

相关文章:

php - 如何在 php 中不换行地回显?

php - 当我尝试将 jquery 脚本添加到 smarty tpl 文件时出了什么问题?

php - 替换单引号和双引号

mysql - 如何在生产中重命名表和某些列

.net - 循环外键。我该如何处理它们?

mysql - 选择按 NULLABLE 列分组的所有行

sql - 在 sql 中选择不同名称和计数名称的查询

php - PHP对于每个一次显示所有结果的10

php - 无法使用 MAMP PRO 从 php 邮件功能发送邮件

mysql - 在特定时间执行查询