2013-10-01 39 views
1

希望标题有道理!如何使用组连接获取'其他'重复值?

鉴于这些值的表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的答案是方言具体)

+0

根据您的示例数据不应该在第一行所要的结果是'A | 1 | D,E'而不是'B,D'? – GarethD

+0

糟糕,是的,你是对的。我已经编辑它为了其他人看这 – user2834566

回答

1

我认为你需要做一个自我联接:

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

+0

啊,这似乎是伎俩!谢谢 – user2834566

0

从你的问题的第一预期输出意味着在某种程度上,你需要规范化的数据库方案,并比如说,你的价值是一个ID,你的ID是价值!

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

应该做的工作(至少在MySQL中,我认为也在sqlite中)。

+0

真正的应用程序涉及教育中使用的一个大型应用程序。表格的每一行都包含一个Staff_ID和他们所教课程的ClassCode。然而,同一班可能会由几位不同的老师教授。对于表格中的每位工作人员,我需要知道还有谁在教这门课程(不包括他们自己)。恐怕你的解决方案似乎没有达到预期的结果。 – user2834566