2012-11-24 22 views
1

最大生產值中選擇一行我有點新到MySQL,所以我被困在查詢。 我有一個數據庫名爲歌曲表(我可以在這個數據庫只讀):如何從計數

table name:cd_production 

code_cd etaireia etos 
______________________ 
400400 ODEON  1987 
400401 ODEON  1986 
400412 COLUMBIA 1990 
400420 COLUMBIA 1990 
400657 LYRA  1965 
410000 COLUMBIA 1962 
410001 COLUMBIA 1964 
410003 PHILIPS 1979 
410005 PHILIPS 1971 
420430 ODEON  2002 
420440 LYRA  2005 
420450 COLUMBIA 2009 
420460 ODEON  2007 
420470 PHILIPS 2008 
420480 ODEON  2002 
420490 COLUMBIA 2010 
500500 SONY  1968 
500510 SONY  1972 
600601 COLUMBIA 1962 
600602 COLUMBIA 1963 
600603 ODEON  1964 
670670 PHILIPS 1983 

,我想找到生產的CDS(意味着不同code_cd每個etaireia)的最大數量的etaireia。 我問

select etaireia ,count(all code_cd) as cds 
from cd_production 
group by etaireia 

和我得到的名單與返回的列

etaireia cds 
________________  
COLUMBIA 8 
LYRA  2 
ODEON  6 
PHILIPS 4 
SONY  2 

這是有點兒正確的,但我不知道如何以最大的CDS只得到etaireia像

etaireia cds 
    ________________  
    COLUMBIA 8 

這裏有什麼竅門? 我不想使用極限1方法導致它不通用。 在此先感謝

+0

如果您有多個具有相同最大數量的行,您想要檢索所有這些行嗎? –

+0

@MichaelBerkowski是的,我想那:) – BugShotGG

+0

好吧,我更新了我的答案。 –

回答

1

其他 「通用」 的方式,應在大多數DBMS運行(不使用MySQL特定LIMIT關鍵字):

SELECT 
    etaireia, 
    COUNT(*) AS cds 
FROM 
    cd_production c 
GROUP BY 
    etaireia 
HAVING 
    COUNT(*) >= ALL 
     (SELECT COUNT(*) 
      FROM cd_production cc 
      GROUP BY cc.etaireia 
     ) ; 

這:

SELECT 
    etaireia, 
    COUNT(*) AS cds 
FROM 
    cd_production c 
GROUP BY 
    etaireia 
HAVING 
    NOT EXISTS 
     (SELECT * 
      FROM cd_production cc 
      GROUP BY cc.etaireia 
      HAVING COUNT(*) > COUNT(DISTINCT c.code_cd) 
     ) ; 

在SQL-兩種測試小提琴:test-1(工作在所有4:Postgres,SQL服務器,甲骨文,MySQL除了第二個查詢不在Postgres中運行)。


對於那些有窗函數(和OVER條款)DBMS,也有另一種方式(從Postgres,甲骨文,SQL-Server 2012的作品):

SELECT etaireia, cds 
FROM 
    (SELECT 
     etaireia, cds, 
     RANK() OVER (ORDER BY cds DESC) AS rnk 
    FROM 
     (SELECT 
      etaireia, 
      COUNT(*) AS cds 
     FROM 
      cd_production c 
     GROUP BY 
      etaireia 
    ) tmp 
) tmp2 
WHERE rnk = 1 ; 

而且會是什麼「標準」方式如下。它應該在Postgres的工作,SQL-服務器支持標準的SQL語法FETCH ... OFFSET(相當於供應商特定LIMITTOP):

SELECT 
    etaireia, 
    COUNT(*) AS cds 
FROM 
    cd_production AS c 
GROUP BY 
    etaireia 
ORDER BY 
    cds DESC 
OFFSET 0 ROWS 
FETCH FIRST 1 ROWS ONLY ; 

兩個測試了SQL-小提琴:test-3(Q4中的Postgres和SQL工作-Server 2012)。 請注意,由於FETCH語法不能解析關係,所以這個結果與第一個查詢的結果不同,因此返回的結果只有一行。

2

如果你想找到有最大數量的所有記錄和他們的數量,你可以使用子查詢的HAVING子句中,以確定哪些MAX()值是COUNT()

SELECT 
    etaireia, 
    COUNT(*) AS cds 
FROM 
    cd_production 
GROUP BY etaireia 
HAVING cds = (
    SELECT MAX(cds) 
    FROM (SELECT etaireia, COUNT(*) as cds 
     FROM cd_production 
     GROUP BY etaireia) subq 
    ) 

http://sqlfiddle.com/#!2/869b4/4

用於限制到單排的方法,RDBMS之間變化。 MySQL使用LIMIT,MSSQL使用TOP,Oracle使用ROWNUM ...使用RDBMS特定的方法使得這更簡單很多,因爲您不需要在HAVING子句中嵌套子查詢。相反,您可以在HAVING子查詢中使用LIMIT僅返回一個最大的COUNT(),而無需換行另一個查詢即可獲得MAX()

SELECT 
    etaireia, 
    COUNT(*) AS cds 
FROM 
    cd_production 
GROUP BY etaireia 
HAVING cds = (
    SELECT COUNT(*) 
    FROM cd_production 
    GROUP BY etaireia 
    ORDER BY COUNT(*) DESC 
    LIMIT 1 
) 

and here is the MySQL-specific version ...

+1

請問我注意到我不想用限制1的方法導致它的錯誤。如果多個原料具有相同的最大值會怎麼樣?它不會工作。 – BugShotGG

+0

打破名字的關係。它使得一個複雜的查詢,雖然。 – Bohemian

+0

@michael berkowski我不明白。它不起作用。查詢假設表中的cds已存在於表中,但情況並非如此。 cds列是輸出 – BugShotGG

0

那麼只能選擇第一則:

select Top 1 etaireia ,count(all code_cd) as cds 
from cd_production 
group by etaireia 

漠視,因爲你不想使用的限制。

+0

似乎不起作用的'頂部'關鍵字。 :(也許它不支持的db – BugShotGG

+1

mysql不使用'TOP',除了這與使用'LIMIT'相同的意圖,OP要求不使用 – Bohemian