2017-05-15 6 views
1

Zuerst muss ich bekommen, um die 10 häufigsten Spaltenwerte zu bekommen, und dann von ihnen Werte brauche ich die neueste Zeile.mysql letzte Reihe am häufigsten Spaltenwert

Ich kann die letzten 10 Spaltenwerte erhalten leicht genug, um wie folgt aus:

SELECT animal, count(*) FROM mammals GROUP BY animal ORDER BY count(*) DESC LIMIT 10; 

Und ich kann auch die letzte Zeile eines Wert wie folgt erhalten:

SELECT * FROM mammals where animal = 'monkey' ORDER BY check_date DESC LIMIT 1; 

Ich muss tun Sie beide in einer Abfrage, wenn möglich. Das nächste, das ich habe, tut alles, was ich brauche, außer dass es nicht die letzte Zeile des Wertes bekommt, sondern die erste Zeile.

SELECT animal, check_date, count(*) FROM mammals GROUP BY animal ORDER BY count(*) DESC LIMIT 10; 

EDIT:

Ich möchte ein bisschen mehr Informationen hinzuzufügen, weil ich nicht sicher bin, es klar genug ist.

Wenn ich habe eine Tabelle wie folgt aus:

+------------------------+---------------------+ 
| Monkey     | 2017-05-08 19:35:30 | 
| Monkey     | 2017-05-09 08:33:16 | 
| Giraffe    | 2017-05-09 08:35:24 | 
| Giraffe    | 2017-05-09 09:09:25 | 
| Monkey     | 2017-05-09 09:22:43 | 
| Giraffe    | 2017-05-09 09:24:23 | 
| Giraffe    | 2017-05-09 09:25:07 | 
| Monkey     | 2017-05-09 09:26:00 | 
| Lion     | 2017-05-09 09:26:17 | 
| Lion     | 2017-05-09 09:28:35 | 
| Gazelle    | 2017-05-09 09:29:34 | 
| Monkey     | 2017-05-09 13:29:39 | 
| Gazelle    | 2017-05-09 13:35:01 | 
| Gazelle    | 2017-05-09 14:52:57 | 
+------------------------+---------------------+ 

Und ich laufen die 3. Abfrage oben ich mit diesem Ende:

+------------------+---------------+----------------+ 
| Animal   | check_date   | count(*) | 
+------------------+---------------+----------------+ 
| Monkey   | 2017-05-08 19:35:30 |  5 | 
| Giraffe   | 2017-05-09 08:35:24 |  4 | 
| Gazzelle   | 2017-05-09 09:29:34 |  3 | 
| Lion    | 2017-05-09 09:26:17 |  2 | 
+------------------+---------------+----------------+ 

Die Tabelle offensichtlich viel größer als dies sein würde, aber Stellen Sie sich vor, das sind die häufigsten Werte. Wie Sie sehen können, ist die Zeile, die die dritte Abfrage zurückgibt, die älteste Zeile, aber ich brauche die letzte Zeile. Also für Affe wäre es "2017-05-09 13:29:39".

muss ich die Tabelle wie folgt aussehen:

+------------------+---------------+----------------+ 
| Animal   | check_date   | count(*) | 
+------------------+---------------+----------------+ 
| Monkey   | 2017-05-09 13:29:39 |  5 | 
| Giraffe   | 2017-05-09 09:25:07 |  4 | 
| Gazzelle   | 2017-05-09 14:52:57 |  3 | 
| Lion    | 2017-05-09 09:28:35 |  2 | 
+------------------+---------------+----------------+ 

Thanks :)

+0

bestellen Sie nicht per Scheckdatum. addiere checkdate auch in der Reihenfolge von in 3. Abfrage – jophab

+0

Ich habe das versucht, aber dann sortiert es nur die Ergebnisse in der Reihenfolge nach Datum. Was ich brauche, ist die letzte Zeile aus jeder der 10 Spalten. Also, wenn es 50 Spalten mit Affen als Wert gibt, brauche ich die letzte Affenreihe. Die dritte Abfrage erhält die erste Affenzeile. –

+0

Sie können mit mehreren Spalten nachbestellen. siehe http://stackoverflow.com/questions/2051162/sql-multiple-column-order – jophab

Antwort

1

Dies sollte das tun, was Sie wollen.

select animal, max(check_date) as max_date, count(*) as count 
    from mammals 
    group by animal 
    order by count(*) desc 
    LIMIT 10; 

Dies ist meine Ausgabe von der obigen Abfrage basierend auf Ihren Beispieldaten.

Monkey | 2017-05-09 13:29:39.000 | 5 
Giraffe | 2017-05-09 09:25:07.000 | 4 
Gazelle | 2017-05-09 14:52:57.000 | 3 
Lion | 2017-05-09 09:28:35.000 | 2 
+0

Das ist geschafft! Danke, Dys, ich werde diese Antwort als richtig markieren. :) –

Verwandte Themen