selfhtml.de - Alles für den Webmaster!

 

Empfehlung:

wix.com

Kostenlose Homepage

Besuchen Sie auch:

Jobs:

MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: laza86
Datum: 07.04.2015 15:21:50

So, nach bestimmt einem Jahr melde ich mich mal wieder.

Hoffe die Frage passt hier in PHP rein, da es eigentlich um eine mySQL Abfrage geht.

Bin seit langem mal wieder am Programmieren und sitze vor einer kniffligen Aufgabe, die meinen Hirnschmalz überfordert ;)

Aber für euch sicher lösbar.

Ich führe folgende Abfrage aus, die mir die primäre ID ausgibt, an der Stelle mein Pointer (Zähler/Punkt der Reihenfolge nach einer Sortierung) gerade ist.

Code:
http://sandbox.onlinephpfunctions.com/code/9d11721ed88de6a927a3c0af3354b67f4af353a2


Funktionier auch einwandfrei.
D.h. wenn ich ihm die ID=5 mitgebe, gibt er mir den dazugehörigen Pointer (Anzahl des Datensatz nach der Reihenfolge sortiert nach ID (ASC) aus.

Soweit so gut.

Jetzt brauche ich aber genau die umgekehrte Variante.
D.h. ich habe den Pointer und benötige die dazugehörige ID. Also wieder in der gleichen Suchreihenfolge wie bei der ersten Abfrage. Einfach nur umgekehrt.

Wer kann mir bei diesem SQL Statement helfen?

Danke im Voraus, laza


Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: Matthias
Datum: 08.04.2015 13:13:26

> Ich führe folgende Abfrage aus, die mir die
> primäre ID ausgibt, an der Stelle mein Pointer
> (Zähler/Punkt der Reihenfolge nach einer
> Sortierung) gerade ist.

Ich bin nicht so der Spezialist bei PHP/MySQL, daher macht es mir Deine oberflächliche Beschreibung auch nicht gerade leicht, das Problem zu verstehen.

> Funktionier auch einwandfrei.
> D.h. wenn ich ihm die ID=5 mitgebe, gibt er mir
> den dazugehörigen Pointer (Anzahl des Datensatz
> nach der Reihenfolge sortiert nach ID (ASC) aus.

Das Sortieren ist für die Aufgabenstellung unerheblich?


> Soweit so gut.
>
> Jetzt brauche ich aber genau die umgekehrte
> Variante.

Was hält Dich davon ab, die ID durch den Rank zu ersetzen? Meinst Du mit Pointer das Feld Rank?

Mir würde es leichter fallen, das Problem zu verstehen, wenn der Aufbau der Tabellen bekannt wäre. Prinzipiell klingt es nach einer Join-Abfrage zweier Tabellen.

Welche Tools benutzt Du für die MySQL Statements? Wäre es nicht höchste Zeit auf MySQLI umzusteigen?


Grüße

Matthias





Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: laza86
Datum: 08.04.2015 14:35:39

> Ich bin nicht so der Spezialist bei PHP/MySQL,
> daher macht es mir Deine oberflächliche
> Beschreibung auch nicht gerade leicht, das
> Problem zu verstehen.

Hey Matthias, erstmal Danke für deine Antwort!

> 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;







> Welche Tools benutzt Du für die MySQL Statements?
Kein Tool, entweder als php Querry oder in phpmyadmin eingetippt.
> 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.

Gruß
laza



OT: mysqli bedeutet [war: Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt]

Autor: reporter
Datum: 09.04.2015 10:59:32

> > Welche Tools benutzt Du für die MySQL
> Statements?
> Kein Tool, entweder als php Querry oder in
> phpmyadmin eingetippt.
> > 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.

http://stackoverflow.com/tags/mysqli/info beantwortet vielleicht die Frage



Re: OT: mysqli bedeutet [war: Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt]

Autor: laza86
Datum: 09.04.2015 14:10:45

> > > Welche Tools benutzt Du für die MySQL
> > Statements?
> > Kein Tool, entweder als php Querry oder in
> > phpmyadmin eingetippt.
> > > 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.
>
> http://stackoverflow.com/tags/mysqli/info
> beantwortet vielleicht die Frage

Danke reporter, sieht wirklich kompakter als die alten mysql abfragen. Werde ich mir fürs nächste Update merken ;



Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: Matthias
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



Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: laza86
Datum: 17.04.2015 12:45:43

> 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.

Lustig, genau so habe ich es auch gemacht. Mit zwei Abfragen und "<=".
Vielleicht hat ja mal jemand ein ähnliches Problem.


> 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.

Danke Matthias für die Info!



Re: MYSQL Abfrage welche ID ein bestimmter Pointer besitzt

Autor: T.Jung
Datum: 10.05.2015 20:22:22

Puuuh, ich war lange nicht hier...
Aber auch wenn das Vorgängerposting schon fast einen Monat alt ist, möchte ich doch gerne noch etwas dazu sagen...

> 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
> 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.

Auch ich stelle ältetere Projekte derzeit immer dann um, wenn ich sie mal wieder anfassen muss -- und neue Projekte (gerade ist eins in der Mache) schreibe ich von vorneherein ohne die MySQL-Funktionen von PHP. Allerdings habe ich mich für PDO entschieden; und zwar hauptsächlich (nicht ausschließlich) aus einem ganz bestimmten Grund:
Die benannten Parameter bei den "prepared statements".

Sehen wir uns zunächst mal einen Codeschnippsel in MySQLi-Syntax an:

<?php
$query = $mysqli->prepare('
    SELECT * FROM users
    WHERE username = ?
    AND email = ?
    AND last_login > ?');
    
$query->bind_param('ssi', 'test', $mail, time() - 3600);
$query->execute();
?>

Hier muss ich gleich zweimal abzählen:
Zunächst einmal bei der Angabe des Variablentyps
    bind_param('ssi' ...
und dann bei der Angaben der Werte:
    'test', $mail, time() - 3600


Beides muss zur Abfolge der Feldnamen im Query passen -- setze ich eins davon in die falsche Reihenfolge, schmeißt mir PHP eine Fehlermeldung um die Ohren.
Ich bin fast hinten rübergekippt, als ich diese Syntax gesehen habe! ;-)
Ich, der schon immer sprintf() gehasst habe, weil man da die übergebenen Argumente von Hand abzählen muss, soll jetzt sämtlich DB-Queries auf die Art und Weise schreiben?!?

Sehen wir uns den gleichen Code in PDO-Syntax an:
<?php
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
    
$pdo->prepare('
    SELECT * FROM users
    WHERE username = :username
    AND email = :email
    AND last_login > :last_login');
    
$pdo->execute($params);
?>

So mag ich's! :-)
Ich verwende benannte Platzhalter (:username, :email, :last_login) und muss nix abzählen. Das ist natürlich Geschmackssache, aber ich mag eben diese Vorgehensweise lieber.

So, und damit tauche ich wieder ab -- werde in nächster Zeit wieder nicht dazu kommen, hier vorbeizuschauen...
Gruß,
Tobias