mysql Ausgabe Spaltenweise limit 3 für alle Einträge mit verschiedenen Kundennummern

  • PHP

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von samson.

    Naja so gut wie alle mysql_* Funktionen sind auch mit mysqli_* verfügbar. Ist zwar nicht so schön, wenn man schon mysqli nutzt, aber trotzdem ein Anfang :P
    @Mono sorry das ich nochmal störe...
    mir ist heute morgen aufgefallen, das ich ja nur eine 'id' nummer für alle rows besitze... Ich brauch alle Row-IDs für jedes Datum...
    Hab es eben versucht mit

    Quellcode

    1. SET @ri=0; .... MAX(IF(ri=1,id,NULL)) AS row_id1, ....
    zu erweitern leider ohne Erfolg. Muss ich da den Zähler bei

    Quellcode

    1. FROM (select @rn:=CASE WHEN @id = kdnr THEN @rn +1 ELSE 1 END AS rn,
    irgendwie auch erweitern?
    Danke und Grüße Stefan

    Komplette Abfrage ist so:

    SQL-Abfrage

    1. SET @id = 0;
    2. SET @rn = 0;
    3. SET @kdnr = 0;
    4. SELECT kdnr,
    5. MAX(IF(rn=1,datum,NULL)) AS besuch1,
    6. MAX(IF(rn=2,datum,NULL)) AS besuch2,
    7. MAX(IF(rn=3,datum,NULL)) AS besuch3,
    8. MAX(IF(id=1,id,NULL)) AS besu1,
    9. MAX(IF(id=2,id,NULL)) AS besu2,
    10. MAX(IF(id=3,id,NULL)) AS besu3
    11. FROM (select @rn:=CASE WHEN @kdnr = kdnr THEN @rn + 1 ELSE 1 END AS rn, @kdnr:=kdnr as kdnr, datum, id from ms_hotline WHERE deleted = '0' AND verhotsys='7' Order by kdnr asc, datum desc) C GROUP BY kdnr;

    Er wirft mir in phpMyAdmin zumindest mal keinen Fehler, jedoch sind die Felder besu1, besu2 und besu3 auch leer.
    Nein! Doch! OHH!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „samson“ ()

    Ok du hast es also nach wie vor nicht verstanden was das innere Select macht^^

    rn ist eine Rankvariable. Sie gibt quasi an wieviele Zeilen es pro KDNR gibt.

    Also
    kdnr 1 hat zum Beispiel 5 Besuche.

    Dann enthält das Select

    rn = 1, Kdnr = 1, Datum = neuestes Datum (da Oder By Datum desc), Id
    rn = 2, Kdnr = 1, Datum = 2. neuestes Datum (da Oder By Datum desc), Id
    rn = 3, Kdnr = 1, Datum = 3. neuestes Datum (da Oder By Datum desc), Id
    ..
    iwann ist @kdnr = 2 und damit wird im Case @rn: durch das else zurück auf 1 gesetzt und der Rank beginnt von vorne.
    Im äußeren Select wird dann über die Kdnr Gruppiert und in der Gruppierung abhängig von rn das datum ausgegeben.
    Das ist quasi der "hack" um Pivot über einen RANK in MySQL abzubilden. Das MAX könnte auch MIN sein oder GROUPCONTACT. Es gibt nur einen Datumwert für rn=1 und die kdnr=1. Genauso ist es mit der ID.
    MAX(IF(rn=1, id, NULL)) as ID1. Wäre dann die Pivot ID dazu. ID2 und ID3 analog.

    mir ist heute morgen aufgefallen, das ich ja nur eine 'id' nummer für alle rows besitze.


    Das sagte ich dir ja bereits, dass wenn du ein GROUP BY hast, und eine Spalte ausgibts ohne Aggregatfunktion die nicht in der GROUP BY Klausel enthalten ist, wirst du keinen "richtigen Wert" erhalten.
    Es kann ja in the Guppierung über Kdnr = 1 zb 5 Besuche geben. Wenn du nun einfach ID ausgibts, wird es vermutlich die letzte sein von möglichen 5. Daher darf man normalerweise nur mit MAX, MIN, COUNT usw die nicht in der Group by enthaltenen Spalten abfragen.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    @Mono
    manchmal ist die lösung so einfach,... ich hab zu kompliziert gedacht, das war schon alles...
    ich bin nicht dahinter gekommen das wenn ich einfach MAX(IF(rn=1,id,NULL)) AS besu_id1, mit rein nehm, es schon reicht...
    Nochmals vielen vielen Dank!
    Hab mir das Snippet nun kommentiert und nochmal beiseite gelegt,... sowas muss man erstmal auswendig lernen :D
    Nein! Doch! OHH!