Ist hier ein Fehler in der Abfrage???
Roy
- php
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
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
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
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
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
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
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
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
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
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
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
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