PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sehr komplexe mysql frage



pyrophet
25.11.02, 13:15
hi

sorry, das ich da mit mysql reinfummle, aber in allen anderen mysql foren habe ich nix bekommen, vielleicht kann ja einer von euch diese aufgabe lösen:

ich muss die letzten 12 Einträge aus einer MySQL DB ausgeben, und zwar der neuste Eintrag zu letzt:

umgekehrt funktioniert es ohne problem (neuster Eintrag am Anfang):
SELECT * FROM db ORDER BY id DESC LIMIT 12;

Das Ziel ist es, das ganze in nur einem SELECT auszuführen

LKH
25.11.02, 13:31
Hallo,

ich würde aus dem hohlen Bauch mit PHP das erst mal so lösen:

- alle Datensätze abfragen (SELECT * FROM db)
- dann die Anzahl bestimmen ($anzahl = mysql_num_rows($result); $anzahl=$anzahl-12)
- dann diese Variable für das Limit-Statement nutzen (SELECT * FROM db LIMIT $anzahl, 12)

Ich hoffe es hilft,

pyrophet
25.11.02, 13:37
thx
muss es warscheinlich au so lösen, mit nur einem SELECT funktioniert es warscheinlich gar nicht. Wäre als Verbesserung an welche die mit MySQL rumskripten gedacht.

greetz

Tocotac
25.11.02, 15:11
die daten stehen doch nach der abfrage in einem array drinne, oder???
les das array doch einfach andersrum aus...

p.s. nich hauen, wenn ich *******e erzähle...

pyrophet
25.11.02, 15:20
thx a.l.

hmmm, die Idee wäre schon mal gar nicht schlecht. Das mit dem Array stimmt auch....
Das einzige was ich jetzt noch machen muss ist, das reinzuproggen das die anzahl datensätze noch variabel ist, aber das ist auch kein problem mehr

greetz @ all

Kernel Fallback
25.11.02, 16:02
Ich hätte da noch was: Is zwar ned das was du suchst, aber vielleicht kannst ja was damit anfangen...


To retrieve all rows from a certain offset upto the end of the
result set, you can use -1 for the second parameter:

SELECT * FROM table LIMIT 95,-1; # Retrieve rows 96-last


Grüße Markus

Hitman
25.11.02, 16:53
Hallo,

das mit dem Array ist sehr schlecht! Es ist bei großen Datenmengen nicht anzuraten.

Wenn du jedoch bei ID "AUTO_INCREMENT" laufen hast, kannst du dir die letzte ID mit "LAST_INSERT_ID" holen. Dann halt beim WHERE-Statement noch die 12 Einträge ("LAST_INSERT_ID" - 12 )abziehen und bis ("LAST_INSERT_ID") laufen lassen. Und dann halt noch ID DESC sortieren.

Gruß

Bernd

pyrophet
25.11.02, 17:46
tönt doch auch mal gar nicht so schlecht, werds gerade auch mal probieren

thx @ all

Manfred.S
25.11.02, 20:31
Das mitder id ist nicht sicher da mysql beliebeig ids vergibt also auch wieder frei gewordene ids hernehmen kann um neue daten zu speichern.

am sinnvollsten ist ein timestamp mitzuspeichern, damit kannst 100% sicher immer nur die letzten 12 inträge auslesen ohne große ressourcen oder rechenzeit zu verbrauchen

Jinto
25.11.02, 22:53
Ich verstehe dein Problem nicht ganz, wenn du deinen Befehl eingibst müsste der neueste Datensatz doch als erstes angezeigt werden, oder?

Zudem bvevor du es kompliziert machst: CREATE VIEW.

Gruß

Hitman
26.11.02, 14:15
Wie bitte?

Seit wann vergibt AUTO_INCREMENT freigewordene Zahlen wieder neu? Im mySQL-Manual steht das nämlich anders drin. Oder benutzt du die o.g. Funktion nicht? Dann kann ich mir auch erklären, warum du IDs auch wieder benutzen tust.

Außerdem erscheint es mir, daß du nicht mit sehr großen Datenbanken rechnen tust. Aber sag mir mal wieviel mehr Speicherplatz das Timestamp benötigt.


Original geschrieben von Manfred.S

Das mitder id ist nicht sicher da mysql beliebeig ids vergibt also auch wieder frei gewordene ids hernehmen kann um neue daten zu speichern.



am sinnvollsten ist ein timestamp mitzuspeichern, damit kannst 100% sicher immer nur die letzten 12 inträge auslesen ohne große ressourcen oder rechenzeit zu verbrauchen

Jasper
26.11.02, 15:08
Original geschrieben von Hitman

Wenn du jedoch bei ID "AUTO_INCREMENT" laufen hast, kannst du dir die letzte ID mit "LAST_INSERT_ID" holen. Dann halt beim WHERE-Statement noch die 12 Einträge ("LAST_INSERT_ID" - 12 )abziehen und bis ("LAST_INSERT_ID") laufen lassen. Und dann halt noch ID DESC sortieren.


was passiert, wenn IDs dazwischen fehlen?

ich würde es so machen:

# id LAST-12 holen
A=select id from bla order by id desc limit 12,1;

# die letzten 12 zeilen anzeigen, beginnend mit der neusten
select * from bla where id > A order by id desc;

mit einer richtigen datenbank würde man sowas mit subselects und views lösen, aber hier gehts ja um mysql :)

-j

Jinto
26.11.02, 15:12
Views gibts auch in MySQL.

Jasper
26.11.02, 15:19
Original geschrieben von Jinto
Views gibts auch in MySQL.

wirklich? ab welcher version?

-j

Jinto
26.11.02, 16:05
Ähmm, habe gerade nochmals nachgesehen. Leider hat mir meine Erinnerung einen Streich gespielt.
It is planned to implement views in MySQL Server around version 5.0.

Ich war mir sicher ich hätte unter subselects etwas mit Views gelesen, habe ich mir aber anscheinend eingebildet.

Sorry.

Harry
26.11.02, 16:41
Hallo,

Fragen zu MySQL sind in unserem Partnerforum unter http://mrunix.de besser aufgehoben.

Harry