2012-03-28 12 views
0

Ich versuche, Daten in einer Tabelle in sortierter Reihenfolge einzufügen, damit sie später schnell abgerufen werden können. Ich verwende eine ordinale Spalte, um die Reihenfolge der Daten anzugeben. So ähnlich:MySQL 5.1 Einfügen/Auswählen von Daten in falscher Reihenfolge

SET @ctr = -1; 

insert into search_data (trans_id, ordinal) 
select trans_id, @ctr:[email protected]+1 
from transactions 
order by created; 

erstellt ist ein Datetime-Feld.

Bei der Auswahl ohne Einfügung werden die Zeilen in der richtigen Reihenfolge zurückgegeben, aber die Variable ctr wird nicht korrekt inkrementiert. Z.B .:

+---+----------+--------------+---------------------+ 
| 1 | trans_id | @ctr:[email protected]+1 | created    | 
+---+----------+--------------+---------------------+ 
| 1 | 131379 |   232 | 2011-10-17 12:27:09 | 
| 1 | 131377 |   231 | 2011-10-17 12:24:30 | 
| 1 | 131311 |   230 | 2011-10-16 23:44:12 | 
| 1 | 131305 |   229 | 2011-10-16 21:57:35 | 
| 1 | 129948 |   46 | 2011-10-10 13:24:58 | 
| 1 | 129947 |   45 | 2011-10-10 13:24:58 | 
| 1 | 129946 |   44 | 2011-10-10 13:24:58 | 
| 1 | 129945 |   43 | 2011-10-10 13:24:58 | 
| 1 | 129944 |   42 | 2011-10-10 13:24:58 | 

Diese Technik für mich in MySQL 5.0, 4.x und 3.x gearbeitet hat Aber es funktioniert nicht in 5.1.

Es scheint, wie die Sortierung nach den Variablen getan wird erhöht, während zuvor die Variable nach der Sortierung erhöht wurde

Irgendwelche Gedanken?

+0

subquery es? wähle trans_id, @ctr: = @ ctr + 1 aus (wähle trans_id aus den Transaktionen aus, durch created, trans_id) – Glenn

+0

Danke, Glenn, du hast mir heute Abend eine Menge Ärger erspart. Schreibe das als Antwort und ich werde es "akzeptieren". – NXT

+0

Danke. Ich frage mich, ob sich das Verhalten zwischen den Veröffentlichungen geändert hat? Ich weiß nichts über die mysql-Regeln, aber Oracle sagt speziell zur Unterabfrage, wenn rownum verwendet wird: Wenn eine ORDER BY-Klausel in derselben Abfrage auf ROWNUM folgt, werden die Zeilen durch die ORDER BY-Klausel neu geordnet. Die Ergebnisse können abhängig davon variieren, wie auf die Zeilen zugegriffen wird. http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm – Glenn

Antwort

2

Try subquery es:

select trans_id, @ctr:[email protected]+1 
    from (select trans_id 
      from transactions 
      order by created, trans_id) as t 

asdfasdf

+0

Danke nochmal, ich habe es bearbeitet, um "as t" zum Ende hinzuzufügen, um einen MySQL-Fehler zu vermeiden ("Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben"). – NXT

+0

Oder besser ich habe versucht, es zu bearbeiten, aber es sagte mir, dass ich mindestens 6 Zeichen in meiner Bearbeitung haben musste, also fügte ich asdfasdf hinzu, aber dann ließ es mich nicht löschen. – NXT

+0

Das ist lustig, ich habe das asdfasdf nicht einmal bemerkt. Danke für die Bearbeitung. Ich habe den Alias ​​vergessen. Postgres fragt auch danach. – Glenn

1

Am Ende der Initialisierung der Variablen ctr befindet sich ein Apostroph. Bitte prüfen Sie, ob es der Syntax entspricht. Ich denke, der Compiler wird durch dieses Apostroph-Zeichen verwirrt.

+0

Danke, aber das ist nur ein Copy/Paste-Fehler, der echte Code ist nicht so. In der Frage behoben. – NXT

Verwandte Themen