2012-07-31 2 views
6

Wie bekomme ich mehr Spalten von MAX(ID), MIN(ID) MYSQL Abfrage?Erhalten Sie mehr Informationen von einer MAX (ID), MIN (ID) MYSQL Abfrage?

Derzeit erhalte ich nur zwei Werte: MAX(ID) & MIN(ID) aus dieser Abfrage:

SELECT MIN(ID), MAX(ID) FROM mytable WHERE mytable.series = 'white' ;

brauchen so etwas wie diese-pseudo-Abfrage zu erhalten:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' 
AND ID=Max(ID) 
'AND GET ME ALSO' 
WHERE series = 'white' 
AND ID=Min(ID);` 

It 2 ​​Zeilen für die Rückkehr sollte Spalte 'Serie', die gleich 'weiß' ist.

1. mit Spalte1 und Spalte2 für ID = Min (ID). 2. mit Spalte1 und Spalte2 für ID = Max (ID).

Aber wie?

Antwort

6

Hier ist ein Ansatz mit UNION:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' AND ID IN 
( 
    SELECT MIN(ID) FROM mytable WHERE series = 'white' 
    UNION 
    SELECT MAX(ID) FROM mytable WHERE series = 'white' 
) 

Für eine gute Leistung fügen Sie einen kombinierten Index auf (series, id).

Oder eine andere Variation, die eine bessere Leistung haben kann:

(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID 
    LIMIT 1 
) 
UNION 
(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID DESC 
    LIMIT 1 
) 

Dies wird auch in der Lage sein, den kombinierten Index auf (series, id) zu verwenden.

+0

Das funktioniert aber nimmt 1.39 min. für eine +5000 Zeilen Daten ... ist das normal? – Ash501

+1

@ Ash501: Das ist absolut nicht normal. Hast du vergessen, Indizes hinzuzufügen? Ich habe meine Antwort aktualisiert, um einen Indexvorschlag hinzuzufügen. Aber mit 5000 Zeilen sollte es auch ohne Index * viel schneller sein. Ist Ihr Datenbankserver zu schwach oder stark ausgelastet? Können Sie Ihre Frage aktualisieren, um zu erwähnen, dass die Leistung ein Problem ist und die Ausgabe von 'SHOW CREATE TABLE ...' und das Ergebnis von 'EXPLAIN SELECT' enthalten? –

+1

@ Ash501, weil Unterabfragen langsam sind, da MySQL sie für jede Zeile ausführen muss. Seine zweite Lösung sollte schneller sein, vorausgesetzt, Sie haben die richtigen Indizes eingerichtet. –

0

Es ist genau so, wie Sie sagen:

SELECT 
    column1, column2 
FROM 
    mytable as m, 
    (SELECT MIN(ID) as mid, MAX(ID) as xid 
    FROM mytable WHERE mytable.series = 'white' 
    ) t 
WHERE 
    m.ID = t.mid or m.ID = t.xid; 

Die select in Klammern ist die innere wählen Sie, dass Sie nur wie eine andere Tabelle verwenden können.

2

Eine einfachere Lösung:

SELECT a.column1, a.column2 
FROM mytable a 
JOIN (
     SELECT MIN(ID) AS minid, MAX(ID) AS maxid 
     FROM mytable 
     WHERE series = 'white' 
     ) b ON a.ID IN (b.minid, b.maxid)