2015-07-19 37 views
2

我有類似下面的數據庫:如何在使用GROUP BY時獲取所有行?

id | col_1 | col_2 
------------------ 
1 | a | x 
2 | a | x 
3 | b | x 
4 | b | z 
5 | c | x 

我想拿到賽COL_2 = x加COL_1的頻率,由頻率排序的所有行。例如,輸出將是:

id | col_1 | col_2 | freq 
------------------------- 
1 | a | x | 2 
2 | a | x | 2 
3 | b | x | 1 
5 | c | x | 1 

我已經試過各種查詢,但因爲我使用GROUP BY獲得的頻率,我無法獲得各行(因爲我希望每個ID)。例如:

SELECT *, COUNT(col_1) AS freq 
FROM mytable WHERE col_2 = x 
GROUP BY col_1 
ORDER BY freq DESC 

不幸的是,這並沒有給我所有的行。它留下id = 2。任何幫助將不勝感激!

謝謝!

回答

1

freq柱看起來像行,其中col_2 = 'x'的一個獨立的,表範圍計數,按id分組。你可以使用此查詢:

這裏是SQL FIDDLE DEMO

SELECT 
    col_1, 
    COUNT(*) AS freq 
FROM myTable 
WHERE col_2 = 'x' 
GROUP BY col_1 

它加入到個人id值的查詢,你應該得到你之後的結果:

SELECT 
    id, 
    col_1, 
    col_2, 
    col2Summary.freq 
FROM myTable 
INNER JOIN (
    SELECT 
    col_1, 
    COUNT(*) AS freq 
    FROM myTable 
    WHERE col_2 = 'x' 
    GROUP BY col_1 
) col2Summary ON myTable.col_1 = col2Summary.col_1 
WHERE col_2 = 'x' 
ORDER BY freq DESC 
0

您的COL_2需要組由太

同時刪除*和僅包含在GROUP BY列

SELECT col_1, col_2, COUNT(*) AS freq 
FROM mytable 
WHERE col_2 = x 
GROUP BY col_1, col_2 
ORDER BY freq DESC 
+0

@jeremytwfortune我們不知道OP需要什麼,也許他需要在網格中顯示結果。但是,你可以有相同的計數()結果 –

+0

OP明確表示他希望在輸出中有'id'。你的解決方案不會這樣做。 –

+0

@jeremytwfortune,OP確實提供了清晰顯示'id'和'count'的所需輸出。一起。這纔是重點。它不僅僅是一個簡單的「分組」。 –

1

這是使用Scalar子查詢重寫的@EdGibbs解決方案。 MySQL的創建一個不同的計劃,你應該測試其更有效(fiddle):

SELECT 
    id, 
    col_1, 
    col_2, 
    (SELECT COUNT(*) 
    FROM myTable AS t2 
    WHERE t.col_1 = t2.col_1 
    AND col_2 = 'x') AS freq 
FROM myTable AS t 
WHERE col_2 = 'x' 
ORDER BY freq DESC; 

順便說一句,幾乎所有其他DBMS支持窗口化集合函數和那麼這將是一個簡單的:

COUNT(*) OVER (PARTITION BY col_1) AS freq