SQL Group ByとOrder By


122

タグのテーブルがあり、リストから最大数のタグを取得したい。

サンプルデータはこのようになります

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

を使用して

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

探しているデータを完全に取り戻します。しかし、私はそれを整理して、最も高いタグ数が最初になるようにし、最初の20かそこらしか送信しないように制限します。

私はこれを試しました...

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

そして、私は「グループ関数の無効な使用-ErrNr 1111」を受け取り続けます

何が悪いのですか?

MySQL 4.1.25-Debianを使用しています

回答:


199

MySQLのすべてのバージョンで、単にSELECTリストの集計にエイリアスを付け、エイリアスで並べ替えます。

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20

9
私見、これは選択した回答よりもクリーンなバージョンです。注文したものはすぐにわかります。もちろん、簡単なスクリプトであれば、それは重要ではありません。
JustAPoring 2013

1
OPはMySQLを使用していますが、この回答はHSQL(Libreoffice組み込み)でも機能しました
Arno Teigseth

53

バージョン5より前のMySQLでは、ORDER BY句で集計関数を使用できませんでした。

廃止された構文でこの制限を回避できます。

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20

1、これはグループ化する最初の列だからです。


8

MySQLについては知りませんが、MS SQLでは、order by句で列インデックスを使用できます。group bysを使用してカウントする場合は、操作が簡単になる傾向があるため、これを以前に行いました。

そう

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

なる

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20

6

Oracleでは、このようなものがうまく機能して、カウントと順序付けを少し改善します。MySql 4で動作するかどうかはわかりません。

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

私は10.1.14-MariaDB(MySQL互換)で動作するようです。私は持っている必要があると思いましたが) as counts、それはas部分なしでまだ機能しました。
ハリーペコネン2017

3

廃止された構文でこの制限を回避できます:ORDER BY 1 DESC

この構文は非推奨ではなく、SQL99のE121-03です。


5
これは回答ではなくコメントにする必要があります。
Rafael Barros、

0

このクエリを試してください

 SELECT  data_collector_id , count (data_collector_id ) as frequency 
    from rent_flats 
    where is_contact_person_landlord = 'True' 
    GROUP BY data_collector_id 
    ORDER BY count(data_collector_id) DESC

これは質問とどのような関係がありますか?フィールドは同じではありません。
ブレイクスセブン2015年7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.