2016-04-14 44 views
0

這個問題是非常相似的:https://stackoverflow.com/posts/1503959/edit 但我想更進一步,併爲每個年齡創建新的列,與該年齡的計數。如何統計SQL中唯一的列和行的發生次數?

我有一桌子的人:

name | age 
-------- 
bill | 25 
tom | 25 
tom | 23 
tom | 23 

我想查詢所有的名字,並附加列計數有多少名是相同的年齡:

name | 23 | 25 
---------------- 
bill | 0 | 1 
tom | 2 | 1 

什麼的最這樣做的有效方法? 我擔心子查詢會很慢,我想知道是否有更好的方法。在那兒?

+0

爲什麼你要年齡爲列,不列非常有用嗎? – Quassnoi

+0

我想要一份有多少名稱不同年齡的人的報告,通過將它製作成三維,它會使桌子變得更小。 – Whitecat

+0

其實表格會更短。但如果有非常年齡的人有很多價值,那麼規模可能實際上要大得多。 – Whitecat

回答

1

如果你有很多年齡值,動態樞軸

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when age = ''', 
     age, 
     ''' then 1 else 0 end) AS ','`', 
     age,'`' 
    ) ORDER BY age 
) INTO @sql 
FROM 
    t; 

SET @sql = CONCAT('SELECT name, ', @sql, ' 
        FROM t 
        GROUP BY name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

FIDDLE

+0

我認爲這只是在年齡出現時顯示1或0 ..我希望這個數字能夠反映出這個人的年齡是多少倍,重複行可以存在。 – Whitecat

+0

@Whitecat只需將總數替換爲http://sqlfiddle.com/#!2/dd2c08/1 – Mihai

0

如何在SQL中執行此操作的最簡單方法是使用GROUP BY

SELECT name, age, COUNT(*) AS occurence FROM table GROUP BY name, age

但你在不同格式的數據。你需要在PHP中重新格式化它們,因爲SQL不能以你想要的方式工作。

+0

我知道這是一種可能性。在SQL中,我可以做到這一點,查詢會變得越來越大,難看 – Whitecat

+0

這不是關於大而難看的查詢。這是關於速度。 MySQL不適合子查詢,也不適合group_concat,並且您想要最有效的方法。所以我告訴你,最有效的方法是使用簡單的GROUP BY查詢PHP中的重新格式化結果,這種方式要快得多。 –

+0

我沒有downvote,但我想只使用SQL和SQL中最有效的東西。 – Whitecat