Roy: Ist hier ein Fehler in der Abfrage???

Hi,

es geht um folgende Abfrage:

$querysql="select UserName,Kategorie,Datum,Kat_sel from tabelle where def_Kat=1 group by Kategorie order by Datum desc";

Kann man die so machen? Ich frage, weil über

$result=mysql_query($querysql);

und

while ($row=mysql_fetch_row($result)) {

sollte doch

$row[0]

jeweils den Namen ausspucken, der datumsmäßig gesehen als erster etwas in die jeweilige Kategorie "XYZ" gepostet hat und bei dem gleichzeitig def_Kat den Wert 1 hat.

Oder nicht??

Grüße

Roy

  1. Oder nicht??

    Hi Roy!

    Sollte "eigentlich" so funktionieren! Natürlich kenne
    ich Deinen genauen Tableinhalt nicht... Hast die Tabelle
    schon mal mit Werten gefüllt und diese Abfrage in PHPMyadmin
    ausgetestet? Von der Syntax stimmt Sie auf jeden Fall und von
    der Logik her auch...

    Viele Grüße

    Chris

    1. Oder nicht??

      Hi Chris,

      hm, habs ausprobiert und erhalte

      Roy Kategorie1 1079539233 , obwohl es einen Datensatz gibt, der
      Yor Kategorie1 1069094779 gibt.

      Einzig in der ID, die die Datenbank per auto_inc. vergibt, liegt der erstgenannte Datensatz vor dem zweiten.

      Sehr merkwürdig...

      Roy

      Hi Roy!

      Sollte "eigentlich" so funktionieren! Natürlich kenne
      ich Deinen genauen Tableinhalt nicht... Hast die Tabelle
      schon mal mit Werten gefüllt und diese Abfrage in PHPMyadmin
      ausgetestet? Von der Syntax stimmt Sie auf jeden Fall und von
      der Logik her auch...

      Viele Grüße

      Chris

      1. Hm, es scheint so, als würde immer der erste "Eintrager" der neuen Kategorie in der Datenbank genommen, auch wenn ich später die Spalte "datum" manipuliere :-(

        Nun habe ich mal die Abfrage

        $querysql="select UserName,Kategorie,Datum,Kat_sel from tabelle where def_Kat=1 group by Kategorie having Datum=min(Datum) order by Datum desc";

        genommen. Das funktioniert auch für alle Kategorien, nur die von mir in der Datumsspalte manipulierte Kategorie wird dann gar nicht mehr (!!) angezeigt... :-((
        Alle anderen wohl...

        Ich fass es nicht.

        Roy

        1. Oops, so:

          $querysql="select UserName,Kategorie,Datum,Kat_sel, min(Datum) from tabelle where def_Kat=1 group by Kategorie having Datum=min(Datum) order by Datum desc";

          Hm, ändert aber nichts, das funkt so nicht...

          Roy

          1. yo,

            select UserName,Kategorie,Datum,Kat_sel, min(Datum) from tabelle where def_Kat=1 group by Kategorie having Datum=min(Datum) order by Datum desc;

            mysql versucht eine lösung anzubieten, die zumindestenz mit vorsichtig zu verwenden ist. spalten die bei einer group by klausel angezeigt werden sollen, sollten auch immer in der group by klausel stehen, mit der ausnahme von aggregatfunktionen. ist dies nicht der fall, kann die auswahl der nicht group by spaltn zu unerwünschten ergebnissen führen. brauchst du keine aggregatfunktion, solltest du dir überlegen, ob group by überhaupt notwendig ist.

            Ilja

            1. mysql versucht eine lösung anzubieten, die zumindestenz mit vorsichtig zu verwenden ist. spalten die bei einer group by klausel angezeigt werden sollen, sollten auch immer in der group by klausel stehen, mit der ausnahme von aggregatfunktionen. ist dies nicht der fall, kann die auswahl der nicht group by spaltn zu unerwünschten ergebnissen führen. brauchst du keine aggregatfunktion, solltest du dir überlegen, ob group by überhaupt notwendig ist.

              Ilja

              Hi Ilja,

              danke für den Hinweis, ich mache gerade wahrscheinlich genau diese Erfahrung ;-(

              Meine Tabelle sieht so aus (vereinfacht):

              ID|User|Kategorie|Datum|def
              01|Use1|Kategori1|10254|0
              02|Use1|Kategori2|10255|0
              03|Use1|Kategori2|10256|0
              04|Use1|Kategori3|10257|1
              05|Use2|Kategori3|10258|1
              06|Use3|Kategori4|10259|1
              07|Use3|Kategori3|10251|1
              08|Use1|Kategori4|10260|1
              08|Use2|Kategori2|10261|0

              def gibt mit einer 1 an, ob die Kategorie, die der User nutzte, frei gewählt wurde, bei def=0 wurde eine der vorgegebenen Kategorien genutzt.

              Nun soll(en) die Abfrage(n) als Ergebnis die verschiedenen Kategorien mit def=1 bringen, den User, der diese Kategorie als erstes genutzt hat und die Anzahl der gesamten Nutzungen dieser Kategorie.

              Meine Versuche kennst Du, hast Du eine Idee?

              Grüße
              Roy

              1. yo,

                Nun soll(en) die Abfrage(n) als Ergebnis die verschiedenen Kategorien mit def=1 bringen, den User, der diese Kategorie als erstes genutzt hat und die Anzahl der gesamten Nutzungen dieser Kategorie.

                das sind ja gleich drei wünsche auf einmal, das geht nun wirklich nicht, es sei den, du willst überraschungseier. ;-)

                spass beseite, ich befürchte, dass wir mit mysql ohne unterabfragen nicht ganz so enfach sein. und erst die neusten versionen von mysql erlauben unterabfragen. ausserdem sind unterabfragen nicht immer so performant, wobei es hier eiegtnlich der gleiche ansatz wäre. mein vorschlag wäre zwei abfragen draus zu machen.

                die erste für die anzahl der jeweiligen kategorien.

                SELECT Kategorie, Count(*) AS Anzahl
                FROM tabelle
                WHERE def=1
                GROUP BY Kategorie

                die zweite um den user zu ermitteln, die sich auf die datensätze der ersten abfrage beziehen, also in der abfrage-schleife mit eingebaut ist.

                SELECT user, datum, kategorie
                FROM tabelle
                WHERE def=1 AND Kategorie=hier_ergebnis_der_ersten_abfrge
                Order BY Datum
                LIMIT 1

                oder abre du machst aus den beiden ein statement mit einer unterabfrage. aber wie gesagt, nicht jede version von mysql kann das.

                Ilja

                1. das sind ja gleich drei wünsche auf einmal, das geht nun wirklich nicht, es sei den, du willst überraschungseier. ;-)

                  *g* :-)

                  Hi Ilja,

                  klar, 2 Abfragen wären schon ok, auch in meiner (momentan nicht ganz wasserdichten) Lösung arbeite ich mit 2 Abfragen.

                  Aber ich glaube, Deine beiden sind nichht ganz richtig.

                  Zitat:

                  Nun soll(en) die Abfrage(n) als Ergebnis die verschiedenen Kategorien mit def=1 bringen, den User, der diese Kategorie als erstes genutzt hat und die Anzahl der gesamten Nutzungen dieser Kategorie.

                  Zitat Ende

                  Soll heißen, als Ergebinis bräuchte ich quasi eine Tabelle, in etwa so: ...
                  ------------------------------------------------------------------

                  OOPS, erst denken, dann schreiben. Sorry, klar, das könnte so gehen :-)

                  Ich teste es heute nachmittag aus, ich schreiben heute abend, obs geklappt hat, aber das sieht sehr gut aus :-)

                  Grüße

                  Roy

                  1. Ich teste es heute nachmittag aus, ich schreiben heute abend, obs geklappt hat, aber das sieht sehr gut aus :-)

                    Jaja, wie es eben so ist, es läßt einem keine Ruhe. Habe also das Script umgestrickt und mit Deinen beiden Abfragen läuft das Teil nun aus wirklich wasserdicht.

                    Eine frage noch:

                    Wenn ich das Datum von 1076749713 auf 1066749713 ändere, wird nun tatsächlich der User als "erster User im Thema" angezeigt, dessen Datum ich "manipuliert" habe.
                    Ändere ich es aber auf 6749713, was ja nun wahrhaftig kleiner ist, wird dieser User, zu dem dieses Datum gehört, aber nihct als "erster User" angezeit.

                    Ergibt das einen Sinn?

                    Grüße und danke

                    Roy

                    1. yo,

                      da bin ich wieder, muttern besucht und vollgefressen. da hilft es nicht, wenn man satt ist, dann bekommt man noch einen schlag mehr. aber lecker ist es immer....

                      Ändere ich es aber auf 6749713, was ja nun wahrhaftig kleiner ist, wird dieser User, zu dem dieses Datum gehört, aber nihct als "erster User" angezeit.

                      welchen genauen datentyp hat den die spalte  ?

                      Ilja

  2. hi,

    $querysql="select UserName,Kategorie,Datum,Kat_sel from tabelle where def_Kat=1 group by Kategorie order by Datum desc";

    wofür brauchst du an dieser stelle das GROUP BY Kategorie überhaupt?

    gruss,
    wahsaga