【问题标题】:How to use group concat to get the 'other' duplicate values?如何使用组 concat 来获取“其他”重复值?
【发布时间】:2013-10-07 13:01:17
【问题描述】:

希望标题有意义!

给定一个包含这些值的表 MyTable

   ID   TheValue
   A         1
   B         2
   C         3
   D         1
   E         1
   F         2

我可以使用

SELECT 
    TheValue,
    group_concat(concat) AS TheIDs
FROM (
    SELECT distinct
        TheValue,
        ID AS concat
    FROM MyTable)
GROUP BY TheValue

得到

TheValue   TheIDs  
   1         A,B,D
   2         B,F
   3         C

我怎样才能获得 ID、TheValue 和“其他”ID 的结果,不包括该行上的 ID

例如

   ID     TheValue   OtherIDs
   A          1        D,E
   B          2        F
   C          3        <null> (or empty string, I don't mind)
   D          1        A,E
   E          1        A,D
   F          2        B

(如果答案是特定方言,我使用 SQLite)

【问题讨论】:

  • 根据您的示例数据,第一行所需的结果不应该是A | 1 | D, E 而不是B, D
  • 哎呀,是的,你是对的。为了其他人查看,我对其进行了编辑

标签: sql sqlite concat group-concat


【解决方案1】:

您的问题的第一个预期输出暗示您需要以某种方式规范您的数据库方案,也就是说,您的值是一个 ID,而您的 ID 是值!

SELECT 
    TheValue,
    group_concat(ID) AS TheIDs
FROM MyTable
GROUP BY TheValue

应该完成这项工作(至少在 MySQL 中,我认为在 sqlite 中也是如此)。

【讨论】:

  • 真正的应用涉及一个用于教育的大应用。表的每一行都包含一个 Staff_ID 和他们教授的班级的 ClassCode。然而,同一堂课可能由几位不同的老师教授。对于表中的每个工作人员,我需要知道还有谁在教该课程(不包括他们自己)。恐怕您的解决方案似乎没有达到预期的效果。
【解决方案2】:

我认为您需要进行自我加入:

SELECT  T.ID,
        T.TheValue,
        GROUP_CONCAT(T2.ID) AS TheIds
FROM    T
        LEFT JOIN T T2
            ON T2.TheValue = T.TheValue
            AND T2.ID != T.ID
GROUP BY T.ID, T.TheValue;

Example on SQL Fiddle

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2017-12-16
    相关资源
    最近更新 更多