MYSQL:如何在 MYSQL GROUP BY 查询中返回所有不重复的行

3
我有一个名为T的表,其中包含一些列和值。
T
========================
id |   name |   g1 |  g2 
=========================
 10 |  abc   |   1  | 1
 14 |  abc   |   1  | 0
 33 |  abc   |   1  | 0
 42 |  def   |   1  | 0 
 52 |  def   |   1  | 1
 63 |  def   |   2  | 0
 66 |  def   |   2  | 0
 67 |  def   |   2  | 0
 74 |  def   |   1  | 0

我想用group by子句选择所有不同的行。
我的查询语句是:
select * 
from T 
group by name 
having max(g2) = 0

我的期望结果将是:
    ========================
    id |   name |   g1 |  g2 
    =========================
     14 |  abc   |   1  | 0
     33 |  abc   |   1  | 0
     42 |  def   |   1  | 0 
     63 |  def   |   2  | 0
     66 |  def   |   2  | 0
     67 |  def   |   2  | 0
     74 |  def   |   1  | 0

我添加了max(g2),因为我需要对每个组进行where子句的添加:D谢谢你的回答。我需要聚合来限制返回(having子句)。另一个解决方法是使用子查询。
我的MySQL只返回每个组的第一行。
    ========================
    id |   name |   g1 |  g2 
    =========================
     14 |  abc   |   1  | 0
     42 |  def   |   1  | 0 

忽略其他列的差异(id和g1),据我记得在使用其他DBMS(如oracle、MsSQL或MySQL)时,我期望我的查询返回上述预期结果,即返回所有不同的行。是否有需要更改的MySQL设置?我已经尝试过SET sql_mode=ONLY_FULL_GROUP_BY,但它只显示提示要指定列,在我理解中,不在group by子句中指定列名是为了显示所有具有不同列值的行。那么,是否需要指定任何sql_mode设置?或者至少为什么MySQL只返回分组的第一行?
set @@global.sql_mode= 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER'

set @@sql_mode=''

提前感谢您的任何回复...
2个回答

3

group by 子句在任何数据库管理系统中都不用于此目的。

select * 
from T 
where g2 =0
order by name

这个查询应该能够满足您的需求。

下面是GroupBy子句的简单解释。GroupBy子句通常与聚合函数一起使用。 http://www.w3schools.com/sql/sql_groupby.asp


2

请试试这个 -

SELECT t1.* FROM t t1
  LEFT JOIN (
    SELECT name, g1, g2, MIN(id) id FROM t
      GROUP BY name, g1, g2
      HAVING COUNT(*) = 1
    ) t2
  ON t1.name = t2.name AND t1.g1 = t2.g1 AND t1.g2 = t2.g2
WHERE t2.id IS NULL;

这个查询将返回所有重复的记录。

我的输出结果是:

+------+------+------+------+
| id   | name | g1   | g2   |
+------+------+------+------+
|   14 | abc  |    1 |    0 |
|   33 | abc  |    1 |    0 |
|   42 | def  |    1 |    0 |
|   63 | def  |    2 |    0 |
|   66 | def  |    2 |    0 |
|   67 | def  |    2 |    0 |
|   74 | def  |    1 |    0 |
+------+------+------+------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接