首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL:如何在mysql GROUP BY查询中返回所有不同的行

问MYSQL:如何在mysql GROUP BY查询中返回所有不同的行
EN

Stack Overflow用户
提问于 2011-11-16 13:20:04
回答 2查看 4.8K关注 0票数 3

我有包含一些列和值的表T

代码语言:javascript
复制
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子句选择所有不同的行

我的问题是

代码语言:javascript
复制
select * 
from T 
group by name 
having max(g2) = 0

我的预期结果是

代码语言:javascript
复制
    ========================
    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只返回每个组的第一行

代码语言:javascript
复制
    ========================
    id |   name |   g1 |  g2 
    =========================
     14 |  abc   |   1  | 0
     42 |  def   |   1  | 0 

忽略其他列(id和g1 )的所有差异。

正如我记得使用其他数据库管理系统(oracle和MsSQL,或MySQL )一样,我可以预期我的查询将返回上面预期的结果。返回所有不同的行。

或者是否有任何mySQL设置需要更改?

我已经尝试过SET sql_mode=ONLY_FULL_GROUP_BY,但它只是显示指定列的通知,在我的理解中,不在group by子句中指定列名是为了显示具有不同列值的所有行。

或者,是否需要指定sql_mode设置??或者至少为什么MySQL只返回组的第一行?

代码语言:javascript
复制
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=''

提前感谢您的回复……

EN

回答 2

Stack Overflow用户

发布于 2011-11-16 13:25:46

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

代码语言:javascript
复制
select * 
from T 
where g2 =0
order by name

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-16 16:23:18

试试这个-

代码语言:javascript
复制
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;

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

我的输出是:

代码语言:javascript
复制
+------+------+------+------+
| 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 |
+------+------+------+------+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8147085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档