SQL: Finde die nächste Zeile in einer WHERE-Klausel mit einer ID

8

Ich habe eine Tabelle namens products in einer MySQL-Datenbank. products sieht etwas wie das aus:

%Vor%

Offensichtlich habe ich mehrere Spalten weggelassen, die für meine Frage nicht wichtig sind. Wenn ich diese Tabelle abfrage, sortiere ich nach einer von mehreren verschiedenen Spalten (Die Benutzerschnittstelle erlaubt einzelnen Benutzern, die Sortierspalte und -reihenfolge zu ändern), und ich kann eine Suchklausel haben, in welchem ​​Fall ich eine LIKE-Klausel machen werde NAME und DIN.

Was ich wissen möchte, ist, dass die Sortierungsinformationen und die Suchinformationen und die ID eines bestimmten Produkts (sprich ich habe nach 004 gesucht, die 3 Ergebnisse zurückgegeben haben, und ich sehe einen von ihnen), wie könnte ich bekommen die nächsten und vorherigen Produkte?

Ich muss dies tun, denn wenn ein Benutzer nach dem Suchen und Sortieren von Ergebnissen auf eines der Produkte klickt, kann er durch die Ergebnisse blättern, ohne zur vorherigen Seite zu gehen.

Gibt es eine gute und effiziente Möglichkeit, dies in SQL zu tun, oder verwende ich am besten PHP? Irgendwelche Ideen sind auch willkommen.

Derzeit wird diese SQL-Abfrage verwendet, bei der Probleme auftreten, wenn ich nach der Spalte strength sortiere, da doppelte Werte vorhanden sind

%Vor%

Mein PHP-Code (mit WordPress) (entworfen, um den nächsten Artikel zu bekommen)

%Vor%     
Brandon Wamboldt 01.02.2011, 19:46
quelle

4 Antworten

5

Sie müssen einen Verweis auf den aktuellen Datensatz haben und dann anhand der sortierten Spalten fortlaufend nach dem nächsten Datensatz suchen. Im folgenden Beispiel wird davon ausgegangen, dass es nach

sortiert ist %Vor%

Erstens:

%Vor%

Weiter: ( vergewissere dich, dass du CURR.ID = 6 und die AND-ORs mit richtigen Klammern trenne! )

%Vor%

Eine funktionierende Probe, die unten vorgestellt wird

%Vor%

Wenn current die Zeile mit ID = 6 ist, kann der nächste Datensatz mit

abgerufen werden %Vor%     
RichardTheKiwi 01.02.2011, 20:07
quelle
1

Ohne eine Persistenz-Cache-Schicht wie memcached , in der Sie die Ergebnisse speichern und abrufen können, ohne die Abfrage erneut auszugeben, kann eine einfache Lösung aktiviert werden der Abfragecache in mysql. Wenn auf diese Weise der Cache nicht von anderen Abfragen ungültig gemacht wird, werden die Kosten für das Ziehen des Ergebnisses gesenkt, wenn Sie die Abfrage erneut ausgeben.

    
Ass3mbler 01.02.2011 19:55
quelle
1

Richten Sie für jedes angezeigte Ergebnis die Links next und previous mit den entsprechenden IDs ein.

Die Sortierreihenfolge kann nicht über die Detailansicht geändert werden.

    
msms 01.02.2011 20:02
quelle
0

Interessante Frage. Ich denke nicht, dass du es in einer Abfrage machen kannst, aber du kannst es vielleicht mit drei ablegen.

Die erste Abfrage ruft die Antwortzeile ab. Der Trick wäre, den Wert für die Spalte beizubehalten, nach der sie sortiert wurden. Nehmen wir an, dies ist "SortedColumn" und der Wert ist "M". Nehmen wir an, die ID der Zeile, die Sie erhalten haben, war 10.

Ihre zweite Abfrage wäre die gleiche wie die erste, wäre aber "top 1" und würde zur where-Klausel "... and sortedColumn & gt; = 'M' und id & lt; & gt; 10" Dies wird hinzugefügt Du die nächste Reihe. Vielleicht möchten Sie 10 Zeilen zurückgeben und an ihnen festhalten, um dies immer wieder zu vermeiden.

Um das vorherige zu erhalten, wechseln Sie Ihre Reihenfolge auf absteigend, und die Where-Klausel, die Sie hinzufügen, ist "... und sortColumn & lt; = 'M' und id & lt; & gt; 10". Dadurch erhalten Sie die vorherige Zeile. Auch hier können 10 Zeilen für Ihren Benutzer hilfreicher sein.

Hoffe, das hilft.

    
Ken Downs 01.02.2011 19:54
quelle

Tags und Links