Отличный запрос MySQL возвращает строки с дублирующейся информацией, требуется дедупликация - PullRequest
1 голос
/ 29 ноября 2011

У меня есть таблица, аналогичная приведенной ниже в базе данных MySQL:

+----------+----------+----------+----------+----------+  
| Column_A | Column_B | Column_C | Column_D | Column_E |      
+----------+----------+----------+----------+----------+      
|        1 |       11 | a        |        0 | abc      |      
|        2 |       22 | a        |        0 | abc      |      
|        3 |       33 | a        |        0 | def      |      
|        4 |       44 | b        |        0 | def      |      
|        5 |          | b        |        0 | def      |      
|        6 |       55 | c        |        0 | ghi      |      
|        7 |          | d        |        0 | jkl      |      
|        8 |          | a        |        4 | abc      |      
|        9 |          | a        |        4 | abc      |      
|       10 |          | b        |        4 | abc      |      
|       11 |       88 | f        |        4 | xyz      |      
|       12 |          | f        |        4 | xyz      |      
+----------+----------+----------+----------+----------+      

Мне нужен результат, аналогичный приведенному ниже (т.е. только значения a & b имеют разные значения столбца D & E):

+----------+----------+----------+
| Column_C | Column_D | Column_E |
+----------+----------+----------+
| a        |        0 | abc      |
| a        |        0 | def      |
| a        |        4 | abc      |
| b        |        0 | def      |
| b        |        4 | abc      |
+----------+----------+----------+

Я пробовал этот запрос:

SELECT DISTINCT column_c,column_d,column_e FROM trial2 ORDER BY column_c;

Я получаю это:

+------------------+------------------+------------------+
|     column_c     |     column_d     |     column_e     |
+------------------+------------------+------------------+
|     a            |            0     |     abc          |
|     a            |            0     |     def          |
|     a            |            4     |     abc          |
|     b            |            0     |     def          |
|     b            |            4     |     abc          |
|     c            |            0     |     ghi          |
|     d            |            0     |     jkl          |
|     f            |            4     |     xyz          |
+------------------+------------------+------------------+

Мне не нужны строки с 'c',«d» или «f» в column_c.Мне нужны строки, которые имеют значения 0 и 4 в column_d (то есть column_c это 'a' или 'b').

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Вам не нужно присоединяться ...

SELECT column_c,column_d,column_e FROM trial2 
GROUP by column_c, column_d, column_e 
HAVING count (*) > 1 
ORDER BY column_c

Предложение has работает после применения агрегата, поэтому вы можете отфильтровать, сколько строк осталось после группировки ...

0 голосов
/ 29 ноября 2011

Не слишком уверен в этом решении, но я думаю, что оно делает то, что вы хотите.

mysql> select * from randdata;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| a    | 0    | f    |
| a    | 2    | x    |
| b    | 2    | x    |
| c    | 0    | f    |
+------+------+------+
4 rows in set (0.00 sec)

mysql> select * from randdata GROUP BY concat(b,c);
+------+------+------+
| a    | b    | c    |
+------+------+------+
| a    | 0    | f    |
| a    | 2    | x    |
+------+------+------+
2 rows in set (0.01 sec)

Запрос:

select * from trial2 GROUP BY concat(column_d,column_e);
0 голосов
/ 29 ноября 2011

DISTINCT просто гарантирует, что строка появляется не более одного раза в выходных данных.Он не удалит строки, которые не совпадают точно с другими строками.

Чтобы работать с несколькими строками одновременно, вам потребуется внутреннее соединение:

SELECT t.C, t.D, t.E
  FROM trial2 AS t
    JOIN trial2 AS tb
      ON t.C=tb.C AND (t.D != tb.D OR t.E != t.E)
  GROUP BY t.C, t.D, t.E
  ORDER BY t.C;

ВнутреннееОбъединение отфильтровывает строки, у которых нет подходящей строки.В приведенном выше запросе совпадают строки, которые имеют одинаковое значение для столбца C, но отличаются в столбце D или E.

...