繁体   English   中英

MySQL-使用行数不匹配的多个子查询的结果

[英]MySQL - using results of multiple subqueries with un-matching numbers of rows

我不知道这是否可行,但我尝试遵循如何在mySQL的子查询中指定父查询字段中给出的建议,在多个子查询中使用MySQL SELECT查询中的值 每个子查询中有不相等的结果数,我怀疑这就是为什么我无法正常工作的原因。

我的数据库比上面的帖子还要复杂。 我正在处理以下5个表:

  1. substances -一种化学物质的列表,所有化学物质都有唯一的ID( substances.id
  2. ecs -EC号*值。
  3. cas -CAS号*值。
  4. ecs_substances -映射substances.idecs.id 一个substances.id可以被映射到一个或多于一个 ecs.id
  5. cas_substances -映射substances.idcas.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

我了解逻辑如下:

  1. SELECT * FROM substances
  2. SELECT * FROM cas_substances WHERE cas_substances.substance_id =
  3. SELECT cas.value FROM cas WHERE cas.cas.id =
  4. 格式化以处理可能存在(或可能不存在)多个cas_substances行的事实-如果存在记录之间的换行符。

. 我不明白如何编写获取的SQL。

在MySQL中甚至有可能做到这一点? 我正在构建的应用程序是用PHP编写的,但我认为仅使用SQL会比用PHP进行多个子查询要快得多(尽管用PHP编写要容易得多)。

您可以将这三个表连接在一起,然后使用group bygroup_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM