我正在寻找从多个表中提取数据的最佳方法,其中每个表返回多行。
这是我目前得到的:
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/