selfhtml.de - Alles für den Webmaster!

 

Empfehlung:

wix.com

Kostenlose Homepage

Besuchen Sie auch:

Jobs:

Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: Matthias [Beiträge: 2230]
Datum: 11.04.2015 12:11:48

> > Was hält Dich davon ab, die ID durch den
> Rank zu
> > ersetzen? Meinst Du mit Pointer das Feld
> Rank?
>
> Ich versuchs nochmal deutlicher zu erläutern:
>
> Ich habe eine Tabelle wie folgende:
>
> ID     Name
> 1      Franz
> 5      Michael
> 6      Jens
> 10     Günter
>
> Die ID ist zwar fortlaufend und Primärschlüssel
> aber es werden immer wieder Datensätze gelöscht.
>
> So jetzt benutze ich einen Pointer um durch einen
> GET Wert (pointer=x) den nächsten und den
> vorherigen Datensatz anzuzeigen. Also in unserem
> Fall wäre pointer=2 gleich Michael. und der
> nächste Datensatz also Pointer=3 gleich Jens.
>
> Funktioniert soweit.
>
> Nun brauche ich eine SQL Abfrage die umgekehrt
> funktioniert. Also wenn ich weiß das ich momentan
> den Datensatz mit der ID 6 berarbeite, ich den
> Pointer zu diesem Datensatz wissen will. In
> diesem Fall wäre das dann die 3.
>
> Also folgende Abfrage:
>
> Zeige mir die Stelle des Datensatzes, wo die ID X
> ist und die Tabelle nach ID ASC sortiert ist.
>
>
> Also die Sortierung spielt dabei natürlich eine
> Rolle. Da ich sonst wieder einen falschen Pointer
> (Stellenwert in der Datenbank) bekomme.
>
>
> Die Abfrage die mir die MitarbeiterID ausgibt hab
> ich leider auch nicht selbst geschrieben, sondern
> nur für meine Tabelle und mein Szenario
> umgeschrieben.
>
>
>
>
>
> Hier nochmal das Statement:
>
> $abfrage_mitarbeiter_id = "SELECT z.rank FROM (
> SELECT t.mitarbeiter_id, @rownum := @rownum + 1
> AS rank
> FROM mitarbeiter t, (SELECT @rownum := 0) r
> ORDER BY mitarbeiter_id ASC
> ) as z WHERE
> mitarbeiter_id='".$_SESSION['mitarbeiter_id']."';";
>
>
> $ergebnis_position =
> mysql_query($abfrage_position);
> while($row_position =
> mysql_fetch_object($ergebnis_position)) {
> $mitarbeiter_id = $row_position->rank;

Okay, ich war ein paar Tage nicht da und hab jetzt gerade wenig Zeit mich ganz rein zu denken. Aber ein paar Gedanken dennoch:

Wenn ich es richtig verstanden habe, was in Deinem Statement steht, dann benutzt Du da einen Hack einer Oracle Funktion, die es in MySQL nicht gibt und die mit diesen Rownum Variablen nachgebildet wird.
Zusammen mit Deiner Beschreibung verstehe ich das nun so, dass Du das machst, weil Deine ID wegen Löschungen nicht fortlaufend ist und Du deshalb mit einem +1 oder -1 nicht verlässlich auf den vorhergehenden oder nachfolgenden Satz zeigen könntest. Richtig? Das ist aus meiner Sicht gar nicht nötig.

Dein Statement, das ich aber nicht bis ins letzte verstehe, macht nach meiner Recherchen folgendes:

Suche eine Datenmenge - > Sortiere diese Datenmenge -> Nummeriere diese sortierte Datenmenge neu -> Suche aus der nummerierten Datenmenge eine Nummer heraus.


Vorrausgesetzt, dass Du den Vorgänger und Nachfolger ermitteln willst, genügt es doch zu schreiben

SELECT * FROM table WHERE ID <= 6 ASC LIMIT 2

Du erhältst 2 Datensätze. Da aufsteigend sortiert wird und nur zwei Datensätze gefunden werden, erhältst Du Datensatz Nr. 5 und als nächstes Nr 6. Gesucht war Nummer 6 und folglich ist Nr. 5 der Vorgänger.

Ein zweites Statement mit > statt < ergibt wieder Nr 6. und als Nachfolger Datensatz Nr. 10.

Zwei einfache Abfragen statt einer besonders komplizierten.

Brauchst Du dann in der Datenausgabe eine fortlaufende Nummerierung, kann das in der Auswerteschleife mit einem einfachen Zähler bewerkstelligt werden.


> > Welche Tools benutzt Du für die MySQL
> Statements?
> Kein Tool, entweder als php Querry oder in
> phpmyadmin eingetippt.

Ja okay, damit geht das ganz gut. Ich empfehle HeidiSQL. Ist einfach zu konfigurieren und es ermöglicht schnelleres Arbeiten mit vielen kleinen Rafinessen.

> > Wäre es nicht höchste Zeit auf MySQLI
> > umzusteigen?

> Ich kann dir gerade nicht mal genau sagen was bei
> mySQLi anders bzw. neu ist. Muss ich mich aber
> mal einarbeiten. Aber für den Fall bleibe ich
> vorerst bei mysql.


Die Unterschiede sind marginal. MySQLi ist objektorientiert und hat eine Funktionsweise, die deutlich abgehärteter gegen Angriffe ist, als bisher. Man kann sogar weitgehend die Syntx beibehalten, nur manche Anweisung braucht manchmal einen weiteren Parameter, dann funzt MySQLi auch nach dem alten prozeduralen Stil. Bei mir hat das Verstehen und umschreiben keine 20 min gedauert.
Ob die prozedurale Verwendung von MySQLi die Sicherheitsvorteile voll zum Tragen bringt, kann ich Dir noch nicht sagen, dazu bin ich in der Objektorientierung noch zu neu und stelle gerade alles schrittweise darauf um, schon weils im Endeffekt effizienter und übersichtlicher wird.

Hauptgrund für den Umstieg ist aber, dass bei den PHP-Umgebungen oberhalb 5.x die Unterstützung für MySQL von vielen Providern deaktiviert wird. Da PHP 4.x nicht auf dem aktuellen Sicherheitsstand ist, wird es also höchste Zeit umzustellen.

Grüße

Matthias


Beiträge

Antwort schreiben

Username: Usernamen registrieren
Passwort: Passwort vergessen?
Thema:
  Bitte benutze für deinen Beitrag die Groß-/Kleinschreibung!
Beitrag:
Link (URL):
Titel für Link:
Grafik (URL):
  Die Breite der Grafik darf 468 Pixel nicht überschreiten.
 
E-Mail-Benachrichtigung:



Zum Abschicken deines Beitrags bitte die Schaltfläche "Abschicken" nur einmal anklicken und warten. Der Server braucht manchmal einige Zeit, bis er den Beitrag in die Datenbank übernommen hat. Wenn du die Schaltfläche mehrmals drückst, erscheint dein Beitrag auch mehrmals im Forum.

Bewerten Sie Ihren Webhosting-Provider

Webhosting Provider bewerten und Apple iPad gewinnenWie zufrieden sind Sie mit Ihrem Webhosting-Provider? Gibt es Probleme beim Service, mit der Performance oder der Abrechnung?

Teilen Sie jetzt Ihre Erfahrungen mit anderen Webmastern und schreiben Sie eine Provider-Bewertung. Mit etwas Glück können Sie ein Apple iPad gewinnen!

Weitere Informationen und Teilnahme...