it-swarm.com.de

Wie finde ich den nächsten Datensatz nach einem bestimmten in SQL?

Ich möchte eine einzelne SQL-Abfrage (in MySQL) verwenden, um den Datensatz zu finden, der nach einem von mir angegebenen Datensatz folgt.

Wenn die Tabelle hat:

id, fruit
--  -----
1   apples
2   pears
3   oranges

Ich möchte in der Lage sein, eine Abfrage wie:

SELECT * FROM table where previous_record has id=1 order by id;

(Das ist natürlich keine echte SQL-Syntax. Ich verwende nur Pseudo-SQL, um zu veranschaulichen, was ich erreichen möchte.)

was zurückkehren würde:

2, pears

Meine derzeitige Lösung besteht darin, alle Datensätze abzurufen und sie in PHP zu durchsuchen, aber das ist langsamer, als ich es gerne hätte. Gibt es einen schnelleren Weg?

Ich würde mit etwas zufrieden sein, das zwei Zeilen zurückgibt - d. H. Die mit dem angegebenen Wert und der folgenden Zeile.

EDIT: Sorry, meine Frage war falsch formuliert. Leider basiert meine Definition von "next" nicht auf der ID, sondern auf der alphabetischen Reihenfolge der Fruchtnamen. Daher ist mein Beispiel oben falsch und sollte Orangen zurückgeben, da es alphabetisch nach Äpfeln folgt. Gibt es eine Möglichkeit, den Vergleich für Zeichenfolgen anstelle von IDs durchzuführen?

18
Ben

Nach der Bearbeitung der Frage und der nachfolgenden Vereinfachung können wir sie in ändern

SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
30
Vinko Vrsalovic
SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1

Noch einfacher

AKTUALISIEREN:

SELECT * FROM table  WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
7
Ólafur Waage

Ich bin nicht mit der MySQL-Syntax vertraut, aber mit SQL Server können Sie etwas mit "top" tun, zum Beispiel:

SELECT TOP 1 * FROM table WHERE id > 1 ORDER BY id;

Dies setzt voraus, dass das ID-Feld eindeutig ist. Wenn es nicht eindeutig ist (z. B. ein Fremdschlüssel), können Sie etwas Ähnliches tun und sich dann an derselben Tabelle erneut anmelden.

Da ich MySQL nicht verwende, bin ich mir der Syntax nicht sicher, würde mir aber vorstellen, dass es ähnlich ist.

1
Scott Isaacs

Wenn Sie keine Sortierreihenfolge angeben, sind die Konzepte "Vorheriges" oder "Nächstes" für Sie in SQL nicht verfügbar. Standardmäßig ist Ihnen eine bestimmte Bestellung nicht im RDBMS garantiert. Wenn Sie nach einer Spalte in aufsteigender oder absteigender Reihenfolge sortieren können, ist das eine andere Sache.

1
duffymo

So einfach und ohne Gymnastik

Select * from Table
where id = 
    (Select Max(id) from Table
     where id < @Id)

oder basierend auf der Zeichenfolge @fruitName = 'Äpfel' oder 'Orangen' etc ... 

Select * from Table
where id = 
    (Select Max(id) from Table
     where id < (Select id from Table
                 Where fruit = @fruitName))
1
Charles Bretana

Ich kenne MySQL SQL nicht, versuche es aber trotzdem

select n.id 
from   fruit n
,      fruit p
where  n.id = p.id + 1;

bearbeiten:

select n.id, n.fruitname 
from   fruits n
,      fruits p
where  n.id = p.id + 1;

zwei bearbeiten:

Jason Lepack hat gesagt, dass das nicht funktioniert, wenn es Lücken gibt und das stimmt und ich die Frage besser lesen sollte. 

Ich hätte Analytics verwenden sollen, um die Ergebnisse nach Fruchtnamen zu sortieren 

select id
,      fruitname
,      lead(id) over (order by fruitname)  id_next
,      lead(fruitname) over (order by fruitname) fruitname_next
from   fruits;
0
tuinstoel

Das sollte funktionieren. Die Zeichenfolge "Äpfel" muss ein Parameter sein.

Füllen Sie diesen Parameter mit einer Zeichenfolge. Diese Abfrage gibt den gesamten Datensatz für die erste Frucht nach dieses Element in alphabetischer Reihenfolge zurück.

Im Gegensatz zum LIMIT 1-Ansatz sollte dies plattformunabhängig sein.

--STEP THREE: Get the full record w/the ID we found in step 2
select *
from 
  fruits fr
 ,(   
  --STEP TWO: Get the ID # of the name we found in step 1
  select
    min(vendor_id) min_id
  from 
    fruits fr1
   ,(
    --STEP ONE: Get the next name after "apples"    
    select min(name) next_name
    from fruits frx
    where frx.name > 'apples'
    ) minval
  where fr1.name = minval.next_name
  ) x
where fr.vendor_id = x.min_id;

Das Äquivalent zum LIMIT 1-Ansatz in Oracle (nur als Referenz) würde folgendermaßen aussehen:

select *
from
  (
  select *
  from fruits frx
  where frx.name > 'apples'
  order by name
  )
where rownum = 1
0
JosephStyons
SELECT cur.id as id, nxt.id as nextId, prev.id as prevId FROM video as cur
  LEFT JOIN video as nxt ON nxt.id > cur.id
  LEFT JOIN video as prev ON prev.id < cur.id
WHERE cur.id = 12
ORDER BY prev.id DESC, nxt.id ASC
LIMIT 1

Wenn Sie den Artikel mit dem vorherigen und dem nächsten Artikel haben möchten, können Sie mit dieser Abfrage genau das tun.

Dadurch können Sie auch Lücken in den Daten haben!

0
Ruuhkis

Wenn Sie MS SQL Server 2008 verwenden (nicht sicher, ob für frühere Versionen verfügbar) ...

Falls Sie versuchen, den nächsten Datensatz zu finden, und Sie keine eindeutige ID haben, um auf eine zutreffende Weise darauf zu verweisen, versuchen Sie es mit ROW_NUMBER().. Siehe diesen Link

Je nachdem, wie geschickt Ihre T-SQL-Fähigkeit ist, können Sie basierend auf Ihrer Sortierreihenfolge Zeilennummern erstellen. Dann können Sie mehr als nur den vorherigen und den nächsten Datensatz finden. Verwenden Sie es in Ansichten oder Unterabfragen, um einen anderen Datensatz relativ zur Zeilennummer des aktuellen Datensatzes zu finden.

0
You're welcome.