Php MySQL-使用具有不匹配行数的多个子查询的结果
我不知道这是否可行,但我正尝试在多个子查询中使用MySQLPhp MySQL-使用具有不匹配行数的多个子查询的结果,php,mysql,Php,Mysql,我不知道这是否可行,但我正尝试在多个子查询中使用MySQLSELECT查询中的值,并遵循在中给出的建议。每个子查询中的结果数不相等,我怀疑这就是为什么我不能让它工作的原因 我的数据库比上面的帖子更复杂。我处理的5个表如下: 物质-化学物质列表,所有化学物质都有唯一的ID(物质.ID) ecs-EC编号*值 cas-cas编号*值 ecs\u物质-映射到ecs.id。一个substances.id可以映射到一个或多个ecs.id cas\u物质-映射substances.id到cas.id。一个物
SELECT
查询中的值,并遵循在中给出的建议。每个子查询中的结果数不相等,我怀疑这就是为什么我不能让它工作的原因
我的数据库比上面的帖子更复杂。我处理的5个表如下:
物质
-化学物质列表,所有化学物质都有唯一的ID(物质.ID
)ecs
-EC编号*值cas
-cas编号*值ecs\u物质
-映射到ecs.id
。一个substances.id
可以映射到一个或多个ecs.id
cas\u物质
-映射substances.id
到cas.id
。一个物质id
可以映射到一个或多个cas.id
substances.id | substances.name
-------------- | ----------------
1 | FooBar
分配给多个CAS号的示例(相同的原则适用于EC,但我只是为了简洁起见使用CAS):
然后CAS编号本身:
cas.id | cas.value
------ | ---------
997 | ABC-123
------ | ---------
23423 | XYZ-876
------------------
理想的结果是,我希望获得每个物质.id,物质.name
的列表,以及相应的CAS/EC编号列表,理想的格式是换行符,例如
substances.id | substances.name | cas_values |
-------------- | --------------- | ------------------ |
1 | FooBar | ABC-123 "\n" XYZ-876
我理解其逻辑如下:
从物质中选择*
SELECT*FROM cas\u substances,其中cas\u substances.substances\u id=
结果来自1(substances.id
)从cas中选择cas.value,其中cas.cas.id=
来自2的结果(cas\u substances.cas\u id
)cas\u行的事实-记录之间的换行符(如果存在)
甚至可以在MySQL中这样做吗?我正在构建的应用程序是用PHP编写的,但我认为只使用SQL要比用PHP编写多个子查询快得多(尽管用PHP编写要容易得多)。您可以将这三个表连接在一起,然后使用
分组方式和分组方式来实现这一点
select
`sub`.*,
group_concat(cas.`value` separator ' "\n" ') as cas_values
from substances `sub`
left join cas_substances cs on `sub`.id = cs.substance_id
left join cas on cas.id = cs.cas_id
group by `sub`.id
A在这里
注意:仅在mysql中有效。接受的答案有效,但我已将其扩展为包括所有5个表:
select
`sub`.*,
group_concat(cas.`value` separator ' "\n" ') as cas_values,
group_concat(ecs.`value` separator ' "\n" ') as ecs_values
from substances `sub`
left join cas_substances cs on `sub`.id = cs.substance_id
left join cas on cas.id = cs.cas_id
left join ecs_substances ec on `sub`.id = ec.substance_id
left join ecs on ecs.id = ec.ec_id
group by `sub`.id
检查一个组_CONCAT(),它应该可以使用SQLS。非常感谢,这很有效。是否可以为group\u concat()
提供别名,因为在返回的数据中,列名是group\u concat(cas.
value`separator''\n')。我还需要对EC编号执行相同的操作,因此可以将COL作为
cas_值`和EC_值
来执行,以便于以后参考。@Andy Alias是可能的。
select
`sub`.*,
group_concat(cas.`value` separator ' "\n" ') as cas_values,
group_concat(ecs.`value` separator ' "\n" ') as ecs_values
from substances `sub`
left join cas_substances cs on `sub`.id = cs.substance_id
left join cas on cas.id = cs.cas_id
left join ecs_substances ec on `sub`.id = ec.substance_id
left join ecs on ecs.id = ec.ec_id
group by `sub`.id