在多列中没有重复值的分组

时间:2014-11-19 11:27:11

标签: mysql sql select group-by

我有以下数据:

+-----+-----+
| ID1 | ID2 |
+-----+-----+
| 100 | AAA |
| 100 | BBB |
| 200 | AAA |
| 200 | BBB |
| 300 | AAA |
| 300 | BBB |
| 300 | CCC |
| 400 | BBB |
+-----+-----+

我需要以某种方式对上表中的行进行分组并得到:

+-----+-----+      +-----+-----+      +-----+-----+
| ID1 | ID2 |      | ID1 | ID2 |      | ID1 | ID2 |
+-----+-----+      +-----+-----+      +-----+-----+
| 100 | AAA |  OR  | 100 | BBB |  OR  | 400 | BBB | IS ACCEPTABLE
| 200 | BBB |      | 200 | AAA |      | 300 | CCC |
| 300 | CCC |      | 300 | CCC |      | 200 | AAA |
+-----+-----+      +-----+-----+      +-----+-----+

上面给出的上述分组结果集中的哪一个并不重要,只要没有重复出现ID1和ID2值。即以下结果集(通过ID1或ID2简单分组获得)将是“错误的”:

+-----+-----+       +-----+-----+
| ID1 | ID2 |       | ID1 | ID2 |
+-----+-----+       +-----+-----+
| 100 | AAA |  AND  | 100 | AAA | ARE BOTH "WRONG"
| 200 | AAA |       | 100 | BBB |
| 300 | AAA |       | 300 | CCC |
| 400 | BBB |       +-----+-----+
+-----+-----+

不要忘记一个重要的事实。我一定会使用MySQL函数。

1 个答案:

答案 0 :(得分:0)

这是一个想法 - 但我不确定(我的)sql是组合问题的最佳工具......

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (id1 INT NOT NULL,id2 CHAR(3) NOT NULL,PRIMARY KEY(id1,id2));

 INSERT INTO my_table VALUES
 (100 ,'AAA'),
 (100 ,'BBB'),
 (200 ,'AAA'),
 (200 ,'BBB'),
 (300 ,'AAA'),
 (300 ,'BBB'),
 (300 ,'CCC'),
 (400 ,'BBB');

 SELECT *
   FROM my_table x 
   JOIN my_table y 
     ON y.id1 > x.id1 
    AND y.id2 <> x.id2 
   JOIN my_table z 
     ON z.id1 > y.id1 
    AND z.id2 <> x.id2 
    AND z.id2 <> y.id2 
  ORDER 
     BY RAND() LIMIT 1;
 +-----+-----+-----+-----+-----+-----+
 | id1 | id2 | id1 | id2 | id1 | id2 |
 +-----+-----+-----+-----+-----+-----+
 | 200 | AAA | 300 | CCC | 400 | BBB |
 +-----+-----+-----+-----+-----+-----+
顺便说一句,如果重要的话,可以按照以下方式重新格式化:

 SELECT a.*
   FROM my_table a
   JOIN 
      ( SELECT x.id1 x_id1
             , x.id2 x_id2
             , y.id1 y_id1
             , y.id2 y_id2
             , z.id1 z_id1
             , z.id2 z_id2
          FROM my_table x 
          JOIN my_table y 
            ON y.id1 > x.id1 
           AND y.id2 <> x.id2 
          JOIN my_table z 
            ON z.id1 > y.id1 
           AND z.id2 <> x.id2 
           AND z.id2 <> y.id2 
         ORDER 
            BY RAND() LIMIT 1
      ) b
     ON (a.id1,a.id2) IN((x_id1,x_id2),(y_id1,y_id2),(z_id1,z_id2));

(延续:)

+-----+-----+
| id1 | id2 |
+-----+-----+
| 100 | AAA |
| 200 | BBB |
| 300 | CCC |
+-----+-----+