Php MySQL连接查询更多表并在一次选择中返回更多结果
我会问,对不起,我的英语不好:( 我有多张桌子Php MySQL连接查询更多表并在一次选择中返回更多结果,php,mysql,innodb,Php,Mysql,Innodb,我会问,对不起,我的英语不好:( 我有多张桌子 CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(50) COLLATE utf8_slovak_ci NOT NULL, `password` varchar(200) COLLATE utf8_slovak_ci NOT NULL, `status` tinyint(1) NOT NULL, PRIM
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) COLLATE utf8_slovak_ci NOT NULL,
`password` varchar(200) COLLATE utf8_slovak_ci NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`id`,`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci;
CREATE TABLE `user_acl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_user` int(11) unsigned NOT NULL,
`group` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci;
CREATE TABLE `user_profil` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(100) COLLATE utf8_slovak_ci NOT NULL,
`fullname` varchar(100) COLLATE utf8_slovak_ci NOT NULL,
`profil` text COLLATE utf8_slovak_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci;
查询:
SELECT user.*, prf.*, acl.*
FROM (SELECT * FROM user LIMIT 1) AS user
LEFT JOIN user_acl AS acl ON (acl.id_user = user.id)
INNER JOIN user_profil AS prf ON (user.id = prf.id)
我有表user
,user\u acl
,user\u profile
表user
和user\u profile
在id
什么是公共键下索引
表
user\u acl
具有id\u user
公用键和表user
(id)在表中,但user\u acl
表中有更多行user
,我需要在一个查询中使用表user\u acl
中的所有行。您不能。如果需要将多个acl行与一个用户行分开,则必须单独进行查询。
[编辑]:但如果您需要使用一个查询来创建它,那么您应该使用某种位操作。您不能。如果您需要将多个acl行与一个用户行分开,则必须将查询分开。
[编辑]:但是如果您需要使用一个查询来编辑它,那么您应该使用某种位操作。您可以让MySQL使用
GROUP\u CONCAT将多行中的值合并到一行中:
SELECT user.*, prf.*, GROUP_CONCAT(acl.id), GROUP_CONCAT(acl.group)
FROM user
LEFT JOIN user_acl AS acl ON (acl.id_user = user.id)
INNER JOIN user_profil AS prf ON (user.id = prf.id)
GROUP BY user.id;
您可以使用GROUP\u CONCAT
,让MySQL将多行中的值组合成一行:
SELECT user.*, prf.*, GROUP_CONCAT(acl.id), GROUP_CONCAT(acl.group)
FROM user
LEFT JOIN user_acl AS acl ON (acl.id_user = user.id)
INNER JOIN user_profil AS prf ON (user.id = prf.id)
GROUP BY user.id;
我不确定我是否理解,因为我测试了这个,它似乎工作了。我现在只需要查询返回一行,这取决于user\u acl
中是否有行,你的意思是希望所有acl
行显示在一行中吗?现在在PHP foreach中使用($db->Select($sql)as$value){if(isset($users[$value['id'])]['group']){$value['group']=$users[$value['id']['group'],'.$value['group'];}$users[$value['id']]=$value;}“您的意思是希望所有acl行显示在一行中吗?”是的,我不确定我是否理解,因为我测试了这个,它似乎起了作用。我现在只需要查询返回一行,这取决于user\u acl
中是否有行。你的意思是希望所有acl
行显示在一行中吗?现在在PHP foreach中使用($db->Select($sql)as$value){if(isset($users[$value['id')]['group']){$value['group']=$users[$value['id']]['group'],'.$value['group'];}$users[$value['id']]=$value;}“你的意思是想让所有acl行显示在一行中吗?”是的,非常感谢。这确实帮助了我,我也学会了另一个重要的命令。再次感谢:)是的,非常感谢。这真的帮助了我,我学会了另一个重要的命令。再次感谢:)