it-swarm.com.de

SELECT LIMIT 1 pro Spaltenwert?

Nehmen wir an, ich habe die folgende Tabelle

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

Wie können Sie eine Zeile pro user_id Auswählen? Meine Ergebnisse wären also:

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

Ist dies mit einer einzigen effizienten Abfrage möglich? Oder sind Unterauswahlen notwendig? Ist es möglich, DISTINCT irgendwie für eine einzelne Spalte zu verwenden?

10
Jake Wilson

Dafür wird GROUP BY Verwendet. Holen Sie sich eine Zeile (pro Gruppe). In diesem Fall werden alle unterschiedlichen user_id - Werte angezeigt. Für den Rest der Spalten können (müssen) Sie Aggregatfunktionen wie MIN(), MAX(), verwenden. AVG(), SUM() da Sie mehr als einen Wert pro Gruppe haben und nur einer angezeigt werden kann.

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQL erlaubt auch die folgende unorthodoxe Lösung, die einen (mehr oder weniger zufälligen) Kommentar pro Benutzer zurückgibt:

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

Diese letzte Abfrage funktioniert nicht, löst jedoch einen Fehler aus, wenn der (strengere) ONLY_FULL_GROUP_BY - Modus aktiviert ist. In der kürzlich veröffentlichten Version 5.7 ist dieser Modus die Standardeinstellung und eine neue Funktion, ANY_VALUE(), wird bereitgestellt. Weitere Informationen finden Sie auf der Seite MySQL-Behandlung von GROUP BY . Die Abfrage kann jetzt geschrieben werden:

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

Beachten Sie, dass bei der "unorthodoxen" Version oder bei Verwendung der aktuellen Funktion ANY_VALUE(), wenn wir der Liste SELECT weitere Spalten hinzufügen, deren Werte nicht garantiert aus derselben Zeile stammen aus einer Reihe in der gleichen Gruppe. Die Art und Weise, wie sie ausgewählt werden, ist nicht genau zufällig und hängt vom Ausführungsplan und den verwendeten Indizes ab.

9
ypercubeᵀᴹ