2011-11-16 49 views
3

我有表筆與某些列和值MYSQL:如何返回所有不同行中的MySQL GROUP BY查詢

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 

,我想by子句

我的查詢,選擇與組的所有DISTICT行是

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 

**我增加了最大值(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='' 

預先感謝您的任何反應......

回答

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