加入的MySQL关系仅输出一行

时间:2018-11-16 21:15:48

标签: mysql

我有两个与用户有关的表。

有问题的三个表是:用户,经销商,项圈。

这里的问题是,一个用户可以有多个项圈,即使有多个关联,我的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提供格式化,我知道这是不合理的,但是我本质上想要的是单记录输出并能够获得所有优势。

1 个答案:

答案 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

dbfiddle demo

然后在您的应用程序框架中可以组合项圈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
)