【问题标题】:GROUP_CONCAT should not include its current valueGROUP_CONCAT 不应包括其当前值
【发布时间】:2021-11-15 08:15:28
【问题描述】:

当前查询

SELECT 
    `Applicants`.`Id` AS `Id`,
    `Applicants`.`ApplicationId` AS `ApplicationId`,
    `Applicants`.`FirstName`,
    `Applicants`.`Surname`,
    GROUP_CONCAT(CONCAT(`Applicants`.`FirstName`,
                ' ',
                `Applicants`.`Surname`)
        SEPARATOR ', ') AS `CoApplicantsNames`
   
FROM
    `Applicants`
WHERE
    (`Applicants`.`IsGuarantor` = 0 )
GROUP BY  `Applicants`.`ApplicationId`

【问题讨论】:

  • GROUP BY Applicants.ApplicationId 为每个Applicants.ApplicationId 返回 1 行,所以你说你得到的结果是不可能的。
  • “当前值”是什么意思?
  • 真实查询是否在申请人和共同申请人之间有JOIN
  • @Barmar 当前值意味着 id 9 firstname aaa 是当前值
  • @Barmar 一个应用程序有多个申请人,因此需要获取具有相同应用程序 ID 的其他申请人姓名

标签: mysql mysql-workbench


【解决方案1】:

问题并不准确,因为您显示的输出(“当前结果”)未按ApplicationId 分组,@forpas 也注意到了,因此它不代表您的真实情况。但是,如果我对您的理解正确,您可以尝试这样做,因为代码将为您提供所需的输出。

SELECT Applicants.Id AS Id, 
    Applicants.ApplicationId AS ApplicationId, 
    Applicants.FirstName, 
    Applicants.Surname, 
    GROUP_CONCAT(CONCAT (
            Applicants2.FirstName, 
            ' ', 
            Applicants2.Surname
            ) SEPARATOR ', ') AS CoApplicantsNames
FROM Applicants
INNER JOIN Applicants AS Applicants2 ON Applicants.ApplicationId = Applicants2.ApplicationID
WHERE Applicants.FirstName != Applicants2.FirstName
    OR Applicants.Surname != Applicants2.Surname
GROUP BY Applicants2.ApplicationId;

第一个FROM 会给你所有可能的申请和申请人的欲望。您可以根据需要额外过滤它(例如 (Applicants.IsGuarantor = 0 ) 。连接表将为您提供最后一个组连接的共同申请人字段。

【讨论】:

  • 你为什么用LEFT JOIN而不是INNER JOIN?仅当第二个表可能有不匹配的行时才使用它,但这种自连接不会发生。
  • @Barmar 你是对的。我编辑了答案。但是在这种情况下,结果将是相同的。
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 2021-11-22
  • 2017-01-02
  • 2022-11-04
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多