mysql - 如何解决子查询返回多于 1 行的问题

标签 mysql sql many-to-many subquery

我知道有很多这样的问题,但我无法在其他地方找到明确的答案。

我有 4 张 table :

  • person_per
  • person2group2role_p2g2r
  • group_grp
  • list_lst

我想要运行一个查询来显示有关某人的所有信息,包括他们所在的组类型

per_ID 位于 person_per 表中

多对多桥具有per_IDgrp_IDrole_ID

grp_ID 位于 group_grp 表中

group_grp 表中的 grp_typelst_optionID 链接

lst_OptionName 是文本中的名称(我最终想要显示的内容)

我尝试了两种方法,但都遇到了相同的错误。选项 1 使用 WHERE 参数链接表,而选项 2 使用 JOIN 语句。 这一切都在第二个子查询中。主查询是拉取个人信息,第一个子查询是拉取人员的分类。

选项 1:

SELECT person_per.per_ID as AddToCart, CONCAT(person_per.per_FirstName, ' ', person_per.per_MiddleName) AS 'FirstNames', person_per.per_LastName AS 'Surname', 
    (SELECT lst_OptionName FROM list_lst WHERE list_lst.lst_ID=1 AND
        list_lst.lst_OptionID=person_per.per_cls_ID) AS "Classification",
    person_per.per_HomePhone AS 'Tel', person_per.per_WorkPhone AS 'Cell',
    person_per.per_Email AS 'Email',
    --START DIFF
    (SELECT lst_OptionName 
    FROM list_lst, person2group2role_p2g2r, group_grp, person_per 
    WHERE list_lst.lst_ID=3 
        AND person_per.per_ID = person2group2role_p2g2r.p2g2r_per_ID 
        AND person2group2role_p2g2r.p2g2r_grp_ID = group_grp.grp_ID 
        AND group_grp.grp_Type = list_lst.lst_ID) AS "LifeGroupType"
    --END DIFF
FROM person_per
ORDER BY person_per.per_LastName

选项 2:

SELECT person_per.per_ID as AddToCart, CONCAT(person_per.per_FirstName, ' ', person_per.per_MiddleName) AS 'FirstNames', person_per.per_LastName AS 'Surname',
    (SELECT lst_OptionName FROM list_lst WHERE list_lst.lst_ID=1 AND
        list_lst.lst_OptionID=person_per.per_cls_ID) AS "Classification",
    person_per.per_HomePhone AS 'Tel', person_per.per_WorkPhone AS 'Cell',
    person_per.per_Email AS 'Email',
    --START DIFF
    (SELECT lst_OptionName 
    FROM list_lst 
        JOIN group_grp ON group_grp.grp_Type = list_lst.lst_ID
        JOIN person2group2role_p2g2r ON person2group2role_p2g2r.p2g2r_grp_ID = group_grp.grp_ID
        JOIN person_per ON person_per.per_ID = person2group2role_p2g2r.p2g2r_per_ID
    WHERE list_lst.lst_ID=3) AS "LifeGroupType"
    --END DIFF
FROM person_per
ORDER BY person_per.per_LastName

我知道这是一个问题,因为每个人都可以分配到多个组,我只是想知道如何将不同的组分开。 更好的结果是每人一行包含他们的所有信息和他们所在的组。 不然我怎么办

  1. 将多个子查询结果 CONCAT 到单个字段中
  2. 为该人的不同群组设置不同的线路

任何信息都会很棒:)

最佳答案

我假设问题是子查询返回不止一行,因为人们在每个表中有多个项目。然后,我假设您正在使用 MySQL。解决方案是一个名为 group_concat() 的函数:

SELECT p.per_ID as AddToCart, CONCAT(p.per_FirstName, ' ', p.per_MiddleName) AS FirstNames, 
       p.per_LastName AS Surname, 
       (SELECT group_concat(lst_OptionName)
        FROM list_lst l
        WHERE l.lst_ID = 1 AND l.lst_OptionID = p.per_cls_ID
       ) AS Classification,
       p.per_HomePhone AS Tel, p.per_WorkPhone AS Cell, p.per_Email AS Email,
    --START DIFF
       (SELECT lst_OptionName 
        FROM person2group2role_p2g2r p2g join
             group_grp g
             on p2g.p2g2r_grp_ID = g.grp_ID join
             list_lst l
             on g.grp_Type = l.lst_ID
        WHERE l.lst_ID = 3 and p.per_ID = p2g.p2g2r_per_ID
       ) AS LifeGroupType
    --END DIFF
FROM person_per p
ORDER BY p.per_LastName;

在此过程中,我还添加了表别名以使查询更具可读性、明确的 join 语法,并删除了子查询中对 person_per 的额外不必要的引用。这可能是导致您出现问题的首要原因。

关于mysql - 如何解决子查询返回多于 1 行的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22730864/

相关文章:

php - 我怎么知道 Laravel 中的交易是否顺利?

mysql - 在 phpMyAdmin MySQL 表中添加一个 TRIGGER 以删除表 A 中的一行,它对应的行在表 B 中被删除

SQL Server操作系统错误5 : "5(Access is denied.)"

java - Hibernate双向多对多级联困惑

PHP:如何使用输出缓冲区缓存页面?

mysql - 使用 .txt 文件填充 MySQL 数据库的问题

mysql - 如何使用 View 执行复杂的 sql 查询,而不是依赖中间(具体)表

sql - 修改 Oracle 中的唯一约束

NHibernate force not-found ignore 不执行额外的选择

java - 尝试使用多对多关系添加投票