我有包含一些列和值的表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 )的所有差异。
正如我记得使用其他数据库管理系统(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=''提前感谢您的回复……
发布于 2011-11-16 13:25:46
在任何数据库管理系统中,group by子句都不用于此目的。
select *
from T
where g2 =0
order by name这个查询应该能满足您的需求
下面是对GroupBy子句的简单解释。GroupBy子句通常与聚合函数一起使用。http://www.w3schools.com/sql/sql_groupby.asp
发布于 2011-11-16 16:23:18
试试这个-
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 |
+------+------+------+------+https://stackoverflow.com/questions/8147085
复制相似问题