2016-09-23 9 views
1

GROUP BYORDER BYHAVINGのレコードを取得しようとしていますが、結果が得られません。GROUP BY、ORDER BY、HAVINGを使用した結果が得られません

+--------------------------------------+-----+---------------------+------+ 
| id         | no | date_entered  | name | 
+--------------------------------------+-----+----------------------------+ 
| c44d1977-0193-a2f1-00f9-57e4c53ba416 | 104 | 2016-09-23 06:02:16 | Z-44 | 
| ca1879a2-df08-4fe3-b144-57e4d2ab0c62 | 104 | 2016-09-23 06:57:35 | Z-44 | 
| 5dd46d35-358a-314e-30fa-57e4d2ca92ad | 104 | 2016-09-23 06:59:17 | Z-44 | 
| d474cc6a-e7a1-15d1-d209-57e4c5aa607d | 105 | 2016-09-23 05:03:08 | Z-45 | 
| db77b687-763d-b63a-be77-57e4d2e246fb | 105 | 2016-09-23 05:51:41 | Z-45 | 
| 70f0f514-c0fd-ddfd-55a6-57e4d21b5e3c | 106 | 2016-09-23 05:29:39 | Z-46 | 
+--------------------------------------+-----+---------------------+------+ 

そして、私はこのような何かなりたい::これは私のテーブルtestである私は同じnoに属し、最古の一つでありますレコードだけを取得したい。ここ

+--------------------------------------+-----+----------+ 
| id         | no | COUNT(*) | 
+--------------------------------------+-----+----------+ 
| 5dd46d35-358a-314e-30fa-57e4d2ca92ad | 104 |  3 | 
| db77b687-763d-b63a-be77-57e4d2e246fb | 105 |  3 | 
+--------------------------------------+-----+----------+ 

を。また、このクエリは、複数のレコードが同じnoに属する場所で実行する必要があります。だから、これは私が

SELECT id, no, COUNT(*) 
FROM test 
GROUP BY no 
HAVING COUNT(*) > 1 
ORDER BY date_entered DESC; 

を使用していたクエリがあるしかし、私は今、この結果

+--------------------------------------+-----+----------+ 
| id         | no | COUNT(*) | 
+--------------------------------------+-----+----------+ 
| c44d1977-0193-a2f1-00f9-57e4c53ba416 | 104 |  3 | 
| d474cc6a-e7a1-15d1-d209-57e4c5aa607d | 105 |  3 | 
+--------------------------------------+-----+----------+ 

を取得しています、私が助けを見て回る必要があり、私はこのHow to combine GROUP BY, ORDER BY and HAVINGを持って、However, you need to pick the fields you ACTUALLY WANT then select only those and group by themことを受け入れ答えで述べたように、だから私もこのクエリを試した:

SELECT id, no, count(*) 
FROM test 
GROUP BY id, no 
HAVING count(*) > 1 
ORDER BY date_entered DESC; 

しかし、このクエリを実行した後、私は何も得ていない。親切に私をここで案内します。このアプローチにはいくつかの制限があります

SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY date_entered DESC), ',', 1) as id, 
     no, COUNT(*) 
FROM test 
GROUP BY no 
HAVING COUNT(*) > 1 ; 

答えて

2

一つの方法は、substring_index()/group_concat()トリックを使用することです。 GROUP_CONCAT()のデフォルトの内部サイズは1,024バイトです。これは簡単に再構成できますが、指定された番号に対してあまりにも多くのIDを持っていないことが前提です。

変数またはより複雑なSQL文を使用する代替アプローチがあります。ただし、これは現在のクエリにフィッティングするのが最も簡単です。

+0

ありがとう@Gorden、それは働いた。しかし、与えられた数には多くのidsがあり、前述したように、 'GROUP_CONCAT()'の内部サイズを再設定する必要があります。私は知っているかもしれません、合併症は何ですか?また、クエリを少し説明すれば、大部分は 'substring_index()/ group_concat()'と言っても大いに役立ちます。ありがとうございました。 –

+1

'group_concat()'はすべてのIDを日付順に長い文字列の順番にします。 'substring_index()'は最初のものを引き出します。 –

+0

こんにちは@GordonLinoff、このクエリをSQL Server 2008に移植する方法はありますか? –