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

Php 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。一个物

我不知道这是否可行,但我正尝试在多个子查询中使用MySQL
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
  • *这些术语用于对化学品进行分类

    数据如何查找1种物质的示例:

    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行的事实-记录之间的换行符(如果存在)
  • 我不明白如何编写从1/2中获取结果的SQL


    甚至可以在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