[英]MySQL - using results of multiple subqueries with un-matching numbers of rows
我不知道这是否可行,但我尝试遵循如何在mySQL的子查询中指定父查询字段中给出的建议,在多个子查询中使用MySQL SELECT
查询中的值? 。 每个子查询中有不相等的结果数,我怀疑这就是为什么我无法正常工作的原因。
我的数据库比上面的帖子还要复杂。 我正在处理以下5个表:
substances
-一种化学物质的列表,所有化学物质都有唯一的ID( substances.id
) ecs
-EC号*值。 cas
-CAS号*值。 ecs_substances
-映射substances.id
到ecs.id
。 一个substances.id
可以被映射到一个或多于一个 ecs.id
cas_substances
-映射substances.id
到cas.id
。 一个substances.id
可以被映射到一个或多于一个 cas.id
数据如何查找一种物质的示例:
substances.id | substances.name
-------------- | ----------------
1 | FooBar
分配多个CAS号的示例(相同的原则适用于EC,但为简洁起见仅使用CAS):
cas_substances.id | substance_id
--------------------------------
997 | 1
----------------- | ------------
23423 | 1
--------------------------------
然后是CAS号本身:
cas.id | cas.value
------ | ---------
997 | ABC-123
------ | ---------
23423 | XYZ-876
------------------
理想的结果是,我希望获得每个substances.id, substances.name
。名称的列表以及相应的CAS / EC编号列表,最好用换行符进行格式化,例如
substances.id | substances.name | cas_values |
-------------- | --------------- | ------------------ |
1 | FooBar | ABC-123 "\n" XYZ-876
我了解逻辑如下:
SELECT * FROM substances
SELECT * FROM cas_substances WHERE cas_substances.substance_id =
SELECT cas.value FROM cas WHERE cas.cas.id =
cas_substances
行的事实-如果存在记录之间的换行符。 . 我不明白如何编写获取的SQL。
在MySQL中甚至有可能做到这一点? 我正在构建的应用程序是用PHP编写的,但我认为仅使用SQL会比用PHP进行多个子查询要快得多(尽管用PHP编写要容易得多)。
您可以将这三个表连接在一起,然后使用group by
和group_concat
来实现。
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
这里的演示 。
注意: GROUP_CONCAT
仅在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.