1

我在 MySQL 数据库中有一个类似于下面显示的表:

+----------+----------+----------+---------+----- -----+  
| 专栏_A | 列_B | 列_C | 专栏_D | 列_E |      
+----------+----------+----------+---------+----- -----+      
| 1 | 11 | 一个 | 0 | 美国广播公司 |      
| 2 | 22 | 一个 | 0 | 美国广播公司 |      
| 3 | 33 | 一个 | 0 | 定义 |      
| 4 | 44 | 乙 | 0 | 定义 |      
| 5 | | 乙 | 0 | 定义 |      
| 6 | 55 | c | 0 | 吉 |      
| 7 | | d | 0 | jkl |      
| 8 | | 一个 | 4 | 美国广播公司 |      
| 9 | | 一个 | 4 | 美国广播公司 |      
| 10 | | 乙 | 4 | 美国广播公司 |      
| 11 | 88 | f | 4 | xyz |      
| 12 | | f | 4 | xyz |      
+----------+----------+----------+---------+----- -----+      

我需要一个类似于下面的结果(即只有 a & b 值具有不同的 D & E 列值):

+----------+----------+----------+
| 列_C | 专栏_D | 列_E |
+----------+----------+----------+
| 一个 | 0 | 美国广播公司 |
| 一个 | 0 | 定义 |
| 一个 | 4 | 美国广播公司 |
| 乙 | 0 | 定义 |
| 乙 | 4 | 美国广播公司 |
+----------+----------+----------+

我试过这个查询:

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

我明白了:

+------------------+------------------+------------ --------+
| 列_c | column_d | 列_e |
+------------------+------------------+------------ --------+
| 一个 | 0 | 美国广播公司 |
| 一个 | 0 | 定义 |
| 一个 | 4 | 美国广播公司 |
| 乙 | 0 | 定义 |
| 乙 | 4 | 美国广播公司 |
| c | 0 | 吉 |
| d | 0 | jkl |
| f | 4 | xyz |
+------------------+------------------+------------ --------+

我不需要 column_c 中带有“c”、“d”或“f”的行。我需要在 column_d 中同时具有 0 和 4 值的行(即 column_c 是“a”或“b”)。

4

3 回答 3

1

你不需要加入...

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

have 子句在应用聚合后运行,因此您可以过滤分组后剩余的行数...

于 2011-11-29T08:25:34.883 回答
0

不太确定这个解决方案,但我认为它可以满足您的需求。

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);
于 2011-11-29T05:27:26.913 回答
0

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 列具有不同值的行。

于 2011-11-29T05:21:38.757 回答