Du bist nicht angemeldet.

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 423

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

09.01.2014, 10:51

MySQL Anzahl Einträge im Select

Morgen,

Ich brauche in einem PHP Skript einen SQL Select. In der Datenbank ist ein ID Feld.

Ich würde gerne so einen SELECT machen(nur ein Muster):
SELECT ID
FROM Tabelle
WHERE ID <= COUNT(ID) && ID > (COUNT(ID)-5);

Das Problem ist halt das COUNT(), weil das klappt wohl so nicht.
Eine Fehlermeldung bekomme ich übrigens nicht.


Natürlich könnte ich zu erst eine Abfrage machen, die mir die Anzahl ausspuckt und diese dann per PHP Variable in der obrigen Abfrage einbauen, aber eine einzige wäre ja schon eleganter.


Wäre schön wenn mir Jemand eine Function oder andere Möglichkeit verraten könnte, mit der ich den obrigen SELECT realisieren könnte

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

2

09.01.2014, 11:03

Wenn die ID der Primärschlüssel der Tabelle ist, dann solltest du nicht annehmen, dass diese immer schön durch nummeriert sind. Also entweder ist das ein schlechtes Beispiel oder du solltest das nicht so machen.

Was genau versuchst du denn zu erreichen, evtl. können wir dir ja helfen etwas besseres zu finden. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 423

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

09.01.2014, 11:04

Doch genau das ist sie :) Die ID ist auto_inkrement


EDIT:
Es geht halt darum dass immer nur 5 Einträge abgefragt werden.

Die letzte Zeile soll also eigentlich so in etwa lauten:

WHERE ID <= COUNT(ID-$first) && ID > (COUNT(ID)-$last);

Werden so ähnlich geändert und übergeben:
$first = $first + 5;
$last = $last + 5;

Und das ganze wird immer beim Seitenwechsel genutzt.


(Alles nur sinngemässe Beispiele)

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

4

09.01.2014, 11:21

Doch genau das ist sie :) Die ID ist auto_inkrement
Wie gesagt du kannst nie darauf gehen, dass die ID durchgehend ist. Wenn du einen Eintrag löschst, wirst du eine Lücke haben (1, 2, 4, 5, 10, 11, 14, ...)

Es geht halt darum dass immer nur 5 Einträge abgefragt werden.
Dafür gibt es LIMIT!
LIMIT 0,5 gibt 5 Einträge vom aller ersten Eintrag aus. Somit musst du für eine Abfrage nur die erste Stelle inkrementieren.
Gibt auch noch LIMIT 5, da werden einfach nur 5 Einträge zurück gegeben. Aber wenn du alle Seiten abfragst, dann werden das immer die ersten 5 Seiten sein.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 423

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

5

09.01.2014, 11:41

Limit habe ich bereits probiert, allerdings habe ich da genau das gleiche Problem.

Die Einträge in der Datenbank sind Beiträge auf einer Website. Der neueste Beitrag soll aber immer der erste sein, deswegen bräuchte ich ja zuerst mal die höchste ID.

mit Limit könnte man das ja so machen:
LIMIT (maxID-5),5;

maxID soll einfach für die höchste ID stehen, nur die Art diese zu ermitteln fehlt mir ja.


Übrigens: Beiträge werden aus der DB niemals gelöscht, von daher sollte eigentlich keine ID fehlen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (09.01.2014, 11:46)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

09.01.2014, 11:51

Wenn du nach ID absteigend sortierst bekommst du mit Limit 5 genau die 5 höchsten.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 423

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

7

09.01.2014, 11:55



Wenn du nach ID absteigend sortierst bekommst du mit Limit 5 genau die 5 höchsten.
Ja, aber wenn man auf die nächste Seite geht, dann müssen es die nächsten 5 sein, dafür bräuchte ich aber die ID des höchsten.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

8

09.01.2014, 12:12

Übrigens: Beiträge werden aus der DB niemals gelöscht, von daher sollte eigentlich keine ID fehlen.
"Eigentlich" ist nie genug Gut. ;)

Ja, aber wenn man auf die nächste Seite geht, dann müssen es die nächsten 5 sein, dafür bräuchte ich aber die ID des höchsten.
Nein brauchst du nicht. Du sortierst die Liste nach Datum, dann sind die ersten Einträge welche du auf der Seite anzeigen willst (z.B. news/list/0), dann hast du einen Link für die nächsten 5 Einträge (.z.B. news/list/5) und auf dieser Seite hast du dann wieder ein Link für die nächsten (news/list/10) und die vorigen (news/list/0) Einträge.

Dann kannst du ganz bequem diese Zahl nehmen und LIMIT übergeben.

Quellcode

1
SELECT * FROM news ORDER BY date DESC LIMIT X,5

Wobei du dann X ersetzt (für PHP mit Prepared Statements!). ;)

Somit würde das dann z.B. so aussehen:

news/list/0
ID Title
25 Hallo Welt
23 2014!
22 Yes Man
20 ABC
19 12345

news/list/5
ID Title
18 Here we go!
16 Spieleprogramierer
15 MHM
13 ARRGG!
12 Firefall

news/list/10
ID Title
10 Woops
09 WHAT?!
08 Quellcode
07 Editor
05 kA
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »eXpl0it3r« (09.01.2014, 13:08)


Sacaldur

Community-Fossil

Beiträge: 2 326

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

09.01.2014, 12:51

eXpl0it3r hat im Grunde schon geschrieben, wie man an diese Sache heran gehen sollte (hervorheben will ich dabei noch ORDER BY, womit man die Sortierung durchführen kann).
Und es sollte wohl "news/list/0", "news/list/5" und "news/list/10" heißen, oder? ^^

Du solltest die Sortierung nicht anhand der ID durchführen, da die Sortierung eigentlich für eine zeitliche Reihenfolge sorgen soll, wofür ohnehin bereits ein Datumsfeld vorhanden sein sollte. Dass die Sortierung der ID's für die gleiche Reihenfolge sorgt, ist grundsätzlich eher Zufall. Würden die ID's anders generiert werden oder würde es irgendwann dazu kommen, dass der Zähler für die Generierung an sein Maximum gerät, hat man eine falsche Reihenfolge bei der Sortierung.
Ein besseres Beispiel sind vielleicht Gutscheine, bei denen die IDs dem generierten Code entsprechen (und somit keine künstlichen IDs verwendet werden). Eine Sortierung dieser würde nicht zur Reihenfolge führen, in der diese generiert wurden (auch wenn es wohl keine Übersicht über generierte Gutschein-Codes geben dürfte...).

Auch wenn keine der Einträge gelöscht werden:
Jetzt willst du noch alle Datensätze der Tabelle in dieser Ansicht darstellen, wenn auch nicht alles gleichzeitig. Später aber willst du vielleicht bestimmte Beiträge ausblenden oder nur bestimmten Benutzern sichtbar machen. Die Anfrage müsste lediglich dahingehend angepasst werden, dass mit Hilfe einer weiteren Bedingung (WHERE) die Datensätze gefiltert werden. Wird das LIMIT richtig verwendet, dann muss man daran auch gar nichts mehr ändern

Zum Verständnis:
Limit bekommt keine Datenwerte, sondern ausschließlich eine Anzahl und ggf. eine Position. Das heißt auch, dass man dies nicht aus einem Datenwert (der ID) errechnen sollte, sondern höchstens anhand der Position eines Datensatzes.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

10

09.01.2014, 13:08

Und es sollte wohl "news/list/0", "news/list/5" und "news/list/10" heißen, oder?
Uhm ja, hab da zu viel "überlegt"... :D
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Werbeanzeige