2010-09-13 14 views
5

diese Tabelle Unter der Annahme, nach Datum geordnetbenachbarte Datensätze in Mysql

id  | date  | customer 
3  | 2009-10-01| Frank 
1  | 2010-10-11| Bob 
4  | 2010-11-01| Mitchel 
2  | 2010-11-02| Jim 

Ich möchte eine Abfrage machen, so dass das Wissen, ID = 4 die resultierenden Reihen sind

$row[0]['id'] == 1 //previous 
$row[1]['id'] == 4 //most recent/current 
$row[2]['id'] == 2 //next 

A mysql nur Lösung wäre am besten, aber wenn es eine elegante php Lösung ist, die auch cool wäre.

+0

wird die Tabelle von 'date' Spalte sortiert? Es sieht so aus. Bitte klären Sie. – shamittomar

+0

'Angenommen, diese Tabelle ist nach Datum sortiert 'Ja, nach Datum, aber wenn es nach Alphabet sortiert wurde, nehme ich an, die Lösung wäre ähnlich – Moak

Antwort

4

Wie die Tabelle von date Spalte sortiert ist, können Sie es folgende Abfragen ausführen zu:

  • Für vorherige Reihe:

    select * from tablename where `date` < (select `date` from tablename where id=4) order by `date` desc limit 1 
    
  • Für aktuelle Zeile:

    select * from tablename where id=4 
    
  • Für die nächste Zeile:

    select * from tablename where `date` > (select `date` from tablename where id=4) order by `date` asc limit 1 
    

Output: Diese drei Abfragen geben das Ergebnis (eine nach der anderen), wie folgend:

id date  customer 
1 2010-10-11 Bob 
4 2010-11-01 Mitchel 
2 2010-11-02 Jim 
+0

Dies funktioniert definitiv, und ist wahrscheinlich der Weg für nur drei Einträge zu gehen; Wenn Sie denken, dass Sie vielleicht z. 5 Datensätze vor und nach dem Ergebnis, dann würde dies nicht mehr funktionieren, und Sie möchten etwas verallgemeinerbarer. – bnaul

0

die Grenzfunktion zwei Argumente annehmen kann, ein Offset und eine Anzahl der zurückzugebenden Zeilen In Ihrem Fall soll der Offset (die Anzahl der Zeilen mit Daten vor der gewünschten Zeile) sein - 1, oder in diesem Fall 2 - 1 = 1, und die Anzahl der Zeilen drei sein. So ist die SQL Sie wollen, ist

SELECT * FROM customers ORDER BY date ASC LIMIT 1,3; 

und die Zahl „1“ wird das Ergebnis der Abfrage sein

SELECT COUNT(*)-1 FROM customers WHERE date > "2010-11-01"; 

Ich glaube nicht, MySQL können Sie eine subselect oder Funktionswert als die Verwendung Argument von LIMIT, also müssen Sie das mit PHP speichern und die nächste Abfrage auf diese Weise konstruieren.

1

Da Sie nach Datum sortieren, aber basierend auf der Zeile, die Sie die benachbarten Zeilen auf ID möchten, müssen Sie 2 Abfragen durchführen. Die erste, um das Datum für die ID zu bestimmen, die Sie ausgewählt haben, die zweite, um die benachbarten Zeilen zu erhalten.

Schritt 1 - Holen Sie sich das Datum

Select date 
FROM yourtable 
WHERE id = 4 

Schritt 2 - Lassen Sie sich alle Zeilen

SELECT * 
FROM yourtable 
WHERE date IN ( (select MAX(date) from yourtable where date < $datefromquery1) 
       , $datefromquery1 
       , (select MIN(date) from yourtable where date > $datefromquery1) 
       ) 
Verwandte Themen