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

そして、生成された最大数の cd を持つ etaireia を見つけたいです (つまり、etaireia ごとに異なる code_cd を意味します)。私は尋ねます

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

これはちょっと正しいですが、次のような最大の cd で etaireia だけを取得する方法がわかりません

    etaireia  cds
    ________________    
    COLUMBIA   8

ここでのトリックは何ですか?LIMIT 1 メソッドは一般的ではないため、使用したくありません。 前もって感謝します

4

3 に答える 3

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

1 行に制限する方法は、RDBMS によって異なります。MySQL は を使用しLIMIT、MSSQL は を使用しTOP、Oracle は を使用します... RDBMS 固有の方法を使用すると、句ROWNUMでサブクエリをネストする必要がないため、これが非常に簡単になります。HAVING代わりLIMITに、サブクエリで を使用して、別のクエリをラップして get することなくHAVING、最大のものだけを返すことができます。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
)

ここにMySQL固有のバージョンがあります...

于 2012-11-24T19:30:15.203 に答える
1

LIMITほとんどの DBMS で実行する必要があるその他の「一般的な」方法 (および MYSQL 固有のキーワードを使用しない):

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-Fiddle: test-1でテストされています(Postgres で実行されない 2 番目のクエリを除いて、Postgres、SQL-Server、Oracle、MySQL の 4 つすべてで動作します)。


ウィンドウ関数 (および句) を持つ DBMS の場合OVER、別の方法もあります (Postgres、Oracle、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 ;

そして、「標準的な」方法は次のとおりです。標準の SQL 構文をサポートする Postgres および SQL-Server で動作するはずです(ベンダー固有のおよび と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-Fiddle: test-3でテストされています(Q4 は Postgres と SQL-Server 2012 で動作します)。FETCHこの構文は同点を解決せず、同点から 1 行のみを返すため、最初の 3 つのクエリとは異なる結果になることに注意してください。

于 2013-01-18T15:44:34.900 に答える
0

最初のものだけを選択してから、次のようにします。

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

制限を使用したくないため、無視してください。

于 2012-11-24T19:32:36.777 に答える