2009-03-25 11 views
2

Ich verwende diese SQL-Abfrage, um eine Liste von Datensätzen nach Datum auf einer PHP-Seite zu sortieren.Auswählen des nächsten Datensatzes aus einer nach Datum sortierten Liste

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM table WHERE upper(ARTICLE_NAME) LIKE % x % ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'); 

Das funktioniert gut.

In einer anderen PHP-Seite möchte ich diesen Datensatz löschen und den nächsten in der Liste anzeigen können. Die Abfrage ich das tun bin mit ist:

SELECT ARTICLE_NO FROM auctions1 WHERE str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s') > (SELECT str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s') FROM table WHERE ARTICLE_NO =".$pk.") ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s') LIMIT 1"; 

Das Problem, das ich scheinen mit zu sein, wird, weil es viele Datensätze mit demselben Datum sind, jeder Datensatz aus der Gruppe von Datensätzen mit dem gleichen Datum wird gewählt werden , nicht das gleiche in der Liste.

Wie kann ich den nächsten Datensatz auswählen, der von der gleichen Ergebnismenge wie die erste Abfrage zurückgegeben wird? Die erste Abfrage gibt immer die gleiche Reihenfolge zurück, daher bin ich mir nicht sicher, warum die zweite Abfrage eine andere Reihenfolge zu haben scheint.

edit:

Ich habe versucht, Quassnoi Ratschläge zu verwenden. Die erste Abfrage ich jetzt benutze ist:

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, 
     date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y') AS shortDate 
FROM AUCTIONS1 
WHERE upper(ARTICLE_NAME) LIKE % x % 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no limit 0, 10 

Und die zweite Abfrage, wie von Quassnoi ist:

SELECT ARTICLE_NO 
FROM auctions1 
WHERE (str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no) > 
     (
     SELECT str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
     FROM auctions1 
     WHERE ARTICLE_NO = xxx 
     ) 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
LIMIT 1 

ich diese Abfrage kopiert, indem Sie es durch meine PHP-Seite Echo und einfach platziert xxx anstelle der article_no, die vorhanden war. Dies stimmt perfekt mit dem ersten Codebeispiel überein, aber die Ergebnisse sind die gleichen wie der Code, den ich in meiner ursprünglichen Frage verwendet habe.

edit2:

Dies ist die Abfrage verwendet, um die ursprüngliche Ergebnismenge zu erhalten:

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y') AS shortDate FROM auctions1 WHERE upper(ARTICLE_NAME) LIKE '%o%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no limit 0, 10; 

, die in dieser Daten ergibt sich, was in Ordnung ist:

ARTICLE_NO USERNAME ACCESSSTARTS  ARTICLE_NAME      shortDate 
160288212077 5864_australen 30/09/2008 05:22:30  DON ED HARDY TIGER JACKE WEISS XL    30 09 2008 
220288566257 fashionticker1 01/10/2008 16:39:12  Ed Hardy Tank Top Lila Neu & OVP Gr. L   01 10 2008 
280273115680 mulle15  01/10/2008 16:42:38  Ed Hardy, T-Shirt,Destroy, schwarz, Gr.L  01 10 2008 
280273115991 mulle15  01/10/2008 16:43:54  Ed Hardy, T-Shirt,Destroy, schwarz, Gr.XL  01 10 2008 
280273116224 mulle15  01/10/2008 16:44:59  Ed Hardy, T-Shirt,Destroy, schwarz, Gr.XXL  01 10 2008 
280273118653 mulle15  01/10/2008 16:54:50  Ed Hardy, T-Shirt,King Snoopy,chocolate, Gr.M  01 10 2008 
120312402767 lieschenjuli 01/10/2008 16:56:12  Badehose Shorts Ed Hardy L    01 10 2008 
280273119206 mulle15  01/10/2008 16:56:47  Ed Hardy, T-Shirt,King Snoopy,chocolate, Gr.XL  01 10 2008 
280273119489 mulle15  01/10/2008 16:57:49  Ed Hardy, T-Shirt,King Snoopy,chocolate, Gr.XXL  01 10 2008 
160288777155 bonifatzius1 01/10/2008 16:58:33  Ed Hardy Bomberjacke Gr. L Jacke für Damen oder H... 01 10 2008 

Das Problem ist, Wenn ich diese Abfrage durchführe:

SELECT ARTICLE_NO 
FROM auctions1 
WHERE (str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no) > 
     (
     SELECT str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
     FROM auctions1 
     WHERE ARTICLE_NO =160288212077 
     ) 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
LIMIT 1; 

Das gibt 280273112610 zurück, wenn 220288566257 zurückgegeben werden soll

+0

Bitte senden Sie einige Beispieldaten aus Ihren Tabellen und was Sie als Ergebnis erhalten möchten. – Quassnoi

+0

ok, posten jetzt. –

+0

Sicher habe ich vergessen, LIKE Bedingung hinzuzufügen. Siehe die erste Abfrage in meinem Post. – Quassnoi

Antwort

1
SELECT ARTICLE_NO 
FROM auctions1 
WHERE upper(ARTICLE_NAME) LIKE '% x %' 
     AND (str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no) > 
     (
     SELECT str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
     FROM auctions1 
     WHERE ARTICLE_NO = @pk 
     ) 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no 
LIMIT 1 

Beachten Sie, dass Ihre ursprüngliche resultset:

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME 
FROM auctions1 
WHERE upper(ARTICLE_NAME) LIKE % x % 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'); 

nicht stabil Zeilenfolge ACCESSSTARTS innerhalb eines garantiert. Sie müssen PRIMARY KEY auf die ORDER BY Klausel hinzuzufügen, wie folgt aus:

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME 
FROM auctions1 
WHERE upper(ARTICLE_NAME) LIKE % x % 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), article_no. 

(I ARTICLE_NO ist die PRIMARY KEY Ihrer Tabelle gehe mal davon aus)

Ihre ursprüngliche rowset, je nachdem, welche Zugriffsmethode ist es mit, kehrt Zeilen entweder in Tabellenreihenfolge in Indexreihenfolge.

Sie müssen wirklich, wirklich, wirklich Ihr ursprüngliches Rowset ändern, um die beständige Reihenfolge zu verwenden.

Aber wenn Sie es nicht aus irgendeinem Grunde tun können, können Sie wie folgt vorgehen:

SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, 
FROM (
     SELECT @c := NULL 
     ) vars, 
     auctions1 
WHERE upper(ARTICLE_NAME) LIKE % x % 
     AND CASE WHEN ARTICLE_NO = $PK THEN @с := 0 ELSE 0 END IS NOT NULL 
     AND (@c := @c + 1) = 2 
ORDER BY 
     str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'); 
LIMIT 1 

Diese Abfrage weniger effizient ist und stützt sich stark auf, dass diese Abfrage genau gleiche Zugriffsmethode wie das Original verwenden Abfrage.

Sie verlassen sich normalerweise nicht auf diese Tatsache, da sich die Zugriffsmethode jederzeit ändern kann.

Wenn Sie klaren und vernünftigen Code möchten, fügen Sie einfach die ARTICLE_NO in ORDER BY und genießen Sie die Abfrage, die ich zuerst gepostet.

+0

Dies führt zu dem gleichen Verhalten wie in meinem Beitrag. Der nächste Datensatz aus meiner Datensatzliste wird nicht ausgewählt, stattdessen wird ein Datensatz mit demselben Datum in einer anderen Reihenfolge ausgewählt. –

+0

HI Quassnoi, danke für die Klarstellung, aber es schlägt immer noch fehl. Ich habe die aktualisierten Abfragen, die ich verwende, in meine Frage eingefügt. –

+0

mit neuen Informationen bearbeitet –

1

Sie könnten auch versuchen, Ihre Ergebnisse von ARTICLE_NO bestellen. Just do:

... ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), ARTICLE_NO ... 

Auf diese Weise sollten beide Ergebnismengen genau die gleiche Reihenfolge haben. In beiden Fällen ist der nächste Datensatz der Datensatz mit der niedrigsten ARTICLE_NO mit einem späteren Datum.

Grüße

Sacher

+0

die ARTICLE_NO Felder sind völlig willkürlich, aber ich werde das versuchen. –

0

Das ist völlig logisch. Sie haben eine Bedingung auf ARTICLE_NAME in der ersten Abfrage, die in der zweiten Abfrage fehlt - die zweite Abfrage gibt mehr Zeilen als die erste zurück. Entferne das LIMIT und du wirst sehen. Die zweite Ordnungsbedingung ist auch eine gute Idee, auch wenn die Anzahl beliebig ist.

Verwandte Themen