Php mysql使用字段名连接到子阵列

Php mysql使用字段名连接到子阵列,php,mysql,join,left-join,concat,Php,Mysql,Join,Left Join,Concat,我试图使用一个查询将表连接到列名=>column value.的子数组中 短表(1)“用户”结构和数据: user_id email ... 1 xxx@xx.xx ... 2 yyy@yy.yy ... 短表(2)“用户权限”结构和数据: user_id plugin_enter offers_view ... 1 1 0 ... 2 1

我试图使用一个查询将表连接到列名=>column value.的子数组中

短表(1)“用户”结构和数据:

user_id   email        ...
1         xxx@xx.xx    ...
2         yyy@yy.yy    ...
短表(2)“用户权限”结构和数据:

user_id   plugin_enter  offers_view  ...
1         1             0             ... 
2         1             1             ... 
如果我使用经典方法-左连接

SELECT `uperms`.*, `u`.*
FROM (`users` as u)
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id`
我得到经典输出

[0] = array(
  'user_id' => 1,
  'email' => xxx@xx.xx,
  'plugin_enter' => 1,
  'offers_view' => 0
),
[1] = array(
  'user_id' => 2,
  'email' => yyy@yy.yy,
  'plugin_enter' => 1,
  'offers_view' => 1,
  ...
),
我只需要输出到子阵列中,如下所示:

[0] = array(
  'user_id' => 1,
  'email' => xxx@xx.xx,
  'permissions => array(
      'plugin_enter' => 1,
      'offers_view' => 0
  ),
),
...
一个查询就可以做到这一点吗


表2(权限)包含大约60列。如果只连接到表1的一行,是否可以使用列值连接列名?

MySQL没有数组或嵌套结构,因此在SQL中不可能这样做

更改查询,以便为
users\u permissions
中的所有字段提供一致的命名样式。然后,您可以使用PHP循环将其键与该模式匹配的所有数组元素收集到
permissions
数组中

查询:

SELECT u.*, up.plugin_enter AS perm_plugin_enter, up.offers_view AS perm_offers_view, ...
FROM users AS u
JOIN users_permissions AS up ON u.user_id = up.user_id
PHP:

可以通过连接表中的所有列名和值来实现:

SELECT u.*, CONCAT_WS(',', CONCAT('plugin_enter:', plugin_enter), CONCAT('offers_view:', offers_view), ...) AS permissions
FROM users AS u
JOIN users_permissions AS up ON u.user_id = up.user_id
然后,您的PHP代码可以使用
explode()
$row['permissions']
拆分为
name:value
对数组,然后将它们转换为PHP数组中的
key=>value

另一个解决方案是重新设计您的
users\u权限
表:

user_id permission_type value
1       plugin_enter    1
1       offers_view     0
...
2       plugin_enter    1
2       offers_view     1
...
然后您可以查询:

SELECT u.*, GROUP_CONCAT(permission_type, ':', value) AS permission
FROM users AS u
JOIN users_permissions AS up on u.user_id = up.user_id

另一种可能的解决方案是为查询添加前缀。
灵感来源于《邮报》:

输出数组如下所示:

[0] => array(
   'user_id' => 1
   'email' => xxx@xx.xx,
   'prefix_start' => 
   'plugin_enter' => 1,
   'offers_view' => 0
   'prefix_end' => 
)
...

然后使用简单的PHP脚本将前缀\u start和前缀\u end之间的所有数组数据添加到自己的子数组中。

我认为这在PHP中是不可能的,因为只有一个查询将表2更改为uid、名称、值等,以避免60列,并且不可能维护查询。感谢您的意见,但权限表并没有所有具有相同“结尾”的列好的,我展示了另一种方法,它不依赖于遵循特定命名方案的列。它在查询中分配别名。没有任何东西会自动执行此操作。您可以编写一个简单的脚本来从DDL创建查询。我不理解您的问题。是关于我的答案还是关于你在另一个问题中找到的答案?对不起,不是关于你的答案。。我发布了主要问题的新的可能解决方案。
SELECT `u`.*, ':prefix_start:', `uperms`.*, ':prefix_end:'
FROM (`users` as u)
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id`
[0] => array(
   'user_id' => 1
   'email' => xxx@xx.xx,
   'prefix_start' => 
   'plugin_enter' => 1,
   'offers_view' => 0
   'prefix_end' => 
)
...