我有两个与用户有关的表。
有问题的三个表是:用户,经销商,项圈。
这里的问题是,一个用户可以有多个项圈,即使有多个关联,我的join语句也只输出一个项圈。
但是,我知道它正在查找与user_id相关的多个项圈,因为如果我改为在我的sql语句中添加GROUP_CONCAT(collars.collar_id)
,它将显示用户拥有的两个项圈。
之所以输出一个项圈,是因为要返回的数组具有键,每个项输出都将覆盖这些键,因为不能有重复的数组键。
这是我的SELECT语句:
SELECT u.*
, d.*
, c.*
FROM users u
JOIN dealers d
ON d.id = u.dealer_id_foreign
JOIN user_collars uc
ON uc.user_id = u.user_id
JOIN collars c
ON c.collar_id = uc.collar_id
WHERE u.user_id = :id
我的问题是,我可以使用一条SQL语句返回该用户与之相关的所有信息吗?也许是多维数组,以便所有项圈都可以退还?
注意:我正在使用PHP PDO执行此操作。这就是select语句中的“:id”变量。
编辑:我将提供我希望通过SELECT语句实现的表结构和数组输出的完整示例。
用户表:
+---------+-------------------+
| user_id | dealer_id_foreign |
+---------+-------------------+
| 1811 | 55 |
| 1812 | 67 |
+---------+-------------------+
经销商表
+----+--------------------+
| id | dealer name |
+----+--------------------+
| 55 | dealer guy |
| 56 | another dealer guy |
+----+--------------------+
衣领表
+-----------+---------------------+
| collar_id | name |
+-----------+---------------------+
| 26 | some collar name |
| 27 | another collar name |
+-----------+---------------------+
User_Collars表(关系表)
+-----------+---------+
| collar_id | user_id |
+-----------+---------+
| 26 | 1811 |
| 27 | 1811 |
+-----------+---------+
如您所见,标识为“ 1811”的用户拥有两个项圈。当我通过ID查询用户时(在这种情况下为1811),我希望通过查询输出所有关系信息,即该用户连接到的经销商以及他们拥有的所有项圈。
我不会在示例数组中包含所有内容,但这应该是示例
Array (
[user_id] => 1811
[user_name] => 'whatever'
[dealer_name] 'the dealer name',
[collars] => [
[some_key_1] => [
[collar_id] => 26
],
[some_key_2] => [
[collar_id] => 27
]
]
)
现在,我意识到我正在要求MySQL提供格式化,我知道这是不合理的,但是我本质上想要的是单记录输出并能够获得所有优势。
答案 0 :(得分:0)
查询本身没有错,它可以正确返回两行数据,如您在此dbfiddle中所见:
user_id dealer_id_foreign id dealer name collar_id name
1811 5 5 55 dealer guy 26 some collar name
1811 55 55 dealer guy 27 another collar name
如果要在一行中获取所有信息,则需要按user_id
将项圈值分组:
SELECT u.user_id
, d.id AS dealer_id
, d.`dealer name`
, GROUP_CONCAT(c.collar_id) AS collar_ids
, GROUP_CONCAT(c.name) AS collar_names
FROM users u
JOIN dealers d
ON d.id = u.dealer_id_foreign
JOIN user_collars uc
ON uc.user_id = u.user_id
JOIN collars c
ON c.collar_id = uc.collar_id
WHERE u.user_id = 1811
GROUP BY u.user_id, d.id
这将为您提供结果中逗号分隔的项圈ID和名称值列表(针对每个用户/经销商组合):
user_id dealer_id dealer name collar_ids collar_names
1811 55 dealer guy 26,27 some collar name,another collar name
然后在您的应用程序框架中可以组合项圈ID和名称值,例如在PHP中,您可以执行以下操作:
$collars = array_combine(explode(',', $row['collar_ids']), explode(',', $row['collar_names']));
这将为您提供如下输出:
Array (
[26] => some collar name
[27] => another collar name
)
或者如果您只想要领子ID
$collars = explode(',', $row['collar_ids']);
这将为您提供如下输出:
Array (
[0] => 26
[1] => 27
)