我的表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子句
的区行my query is
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),因为我需要对每个组创建add where子句。谢谢你的回答。我需要聚合来限制返回(有子句)。另一种方法是使用子查询
通过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=''
group by
子句在任何dbms中都不用于此目的。
select *
from T
where g2 =0
order by name
这个查询应该满足您的目的
下面是GroupBy子句的简单解释。GroupBy子句通常用于聚合函数。http://www.w3schools.com/sql/sql_groupby.asp
试试这个-
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 |
+------+------+------+------+