我正在寻找从多个表中提取数据的最佳方法,其中每个表返回多行。
这是我目前得到的:
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] =>值数组,但是当按值搜索数据时我会遇到相同的效率问题(例如)。
答案 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