【问题标题】:MYSQL: how to return all distinct row in mysql GROUP BY queryMYSQL:如何在 mysql GROUP BY 查询中返回所有不同的行
【发布时间】:2011-11-16 05:20:04
【问题描述】:

我有一些列和值的表 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 谢谢你的回答。我需要聚合来限制返回(有子句)。另一种解决方法是使用子查询

我的 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=''

提前感谢您的任何回复...

【问题讨论】:

    标签: mysql group-by sql-mode


    【解决方案1】:

    group by 子句在任何 dbms 中都不用于此目的。

    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 |
      +------+------+------+------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2021-11-15
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多