2010-04-29 10 views

Antwort

9

Wie wäre es so etwas wie:

select 'first', f1, f2, f3, f4 from tbl 
    order by f1 asc, f2 asc 
    limit 1 
union all 
select 'last', f1, f2, f3, f4 from tbl 
    order by f1 desc, f2 desc 
    limit 1 

Offensichtlich fühlen sich frei, was Bedingung, die Sie in einer where Klausel hinzufügen möchten aber die grundlegende Prämisse des order by ist die Reihenfolge, in den beiden select Abschnitte zu umkehren.

Die limit-Klausel erhält in beiden Fällen nur die erste Zeile. Das ist zufällig die letzte Zeile des Satzes in der zweiten select aufgrund der Tatsache, dass Sie die Reihenfolge umgekehrt haben.

Wenn nur eine Zeile aus Ihren Bedingungen resultiert und Sie nicht möchten, dass sie zweimal zurückgegeben wird, verwenden Sie union statt union all.

+0

Was ist mit Klammern? –

+1

@Alexander, ja Klammern sind sehr nett, und haben einen reibungslosen Ablauf über sie. Sie sind auch sehr attraktiv, wenn sie richtig ausbalanciert sind. Allerdings sind sie nicht wirklich notwendig für meine Antwort zu arbeiten, also werde ich sie für jetzt aus der Gleichung lassen :-) – paxdiablo

+0

Ohne Klammern bekomme ich eine Ausnahme 'SQLSTATE [HY000]: Allgemeiner Fehler: 1221 Falsche Verwendung von UNION und ORDER BY " –

23

Der erste und der letzte Sinn sind nur dann sinnvoll, wenn die Ausgabe der Abfrage nach einem oder mehreren Feldern sortiert ist.

Um den ersten Datensatz zu erhalten:

select col1 from tab1 order by col1 asc limit 1; 

den letzten Datensatz zu erhalten:

select col1 from tab1 order by col1 desc limit 1; 
5
select * from table 
where id = (select id from tab1 order by col1 asc limit 1) or 
id = (select id from tab1 order by col1 desc limit 1); 
+0

Die Semikolons in Ihren Unterabfragen werden diese Aussage brechen. – dangermark

16
SELECT 
(SELECT column FROM table WHERE [condition] ORDER BY column LIMIT 1) as 'first', 
(SELECT column FROM table WHERE [condition] ORDER BY column DESC LIMIT 1) as 'last' 

Das ist für mich gearbeitet, als ich zum ersten Mal und das letzte Datum auszuwählen erforderlich in der Veranstaltungsreihe.

-1
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees 
    ORDER BY LENGTH(first_name) ASC 
    FETCH FIRST 1 rows ONLY) 
UNION 
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees 
    ORDER BY LENGTH(first_name) DESC 
    FETCH FIRST 1 rows ONLY) 
ORDER BY 2 desc; 
+2

'FETCH FIRST' ist nicht gültig. MySQL-Syntax – FrankerZ

+0

@FrankerZ: Danke für das Zeigen. Ja, das FETCH FIRST ist für Oracle Sql. –

Verwandte Themen