Archiv verlassen und diese Seite im Standarddesign anzeigen : max(count())=
mrhappiness 20-01-2003, 09:51 Folgende Abfrage liefert das gewünschte Ergebnisselect d.deptno , d.dname, count(e.ename) as anzahl
from emp e
left join dept d
on e.deptno = d.deptno
group by d.deptnoDas gibt mir die Anzahl Mitarbeiter pro Abteilung aus.
Wie kann ich jetzt nur die Abteilung mit den meisten mitarbeitern zurückgeliefert bekommen ohne verwendung von limitselect d.deptno , d.dname, max(count(e.ename)) as anzahl
from emp e
left join dept d
on e.deptno = d.deptno
group by d.deptnofunzt net (Fehler: Invalid use of group function)
Lass einfach mal das group by weg...
select d.deptno , d.dname, max(count(e.ename)) as anzahl
from emp e
left join dept d
on e.deptno = d.deptno
mrhappiness 20-01-2003, 10:28 danke, aber tut nich.
gleiche fehlermeldung (Invalid use of group function)
mach noch zusaätzlich das 'd.dname' in den group rein ...
...
group by d.deptno,d.dname
oder lasse das feld beim select einfach raus.
mrhappiness 20-01-2003, 14:08 tut auch nich (same error message)
was passiert, wenn du das count(...) und group weglässt?
wie sehen denn die tabellen aus, und wie soll die ausgabe sein?
vielleicht habe ich nur einen denkfehler.
MelloPie 20-01-2003, 14:41 max ( count () ) geht nicht, das besagt auch die Fehlermeldung
invalid use of group function benennt nicht das group by sondern das max
Du könntest order by desc benutzen und dann nur den ersten wert nehmen.
Was spricht gegen LIMIT ?
mrhappiness 20-01-2003, 17:05 gegen limit spricht, dass wir an der ba (berufsakademie, sowas wie uni) oracle sql*plus haben und wir "limit" noch nicht kennen (laut dozent), bzw. das gar nich unterstützt wird.
in oracle geht's eigentlich auch nich so, da geht es über sub-queries, die von mysql aber auch nicht unterstüptzt werden afaik :(//Oracle
select d.deptno, d.dname, COUNT(*)
from dept d, emp e
where d.deptno = e.deptno
group by d.deptno, d.dname
having count(*) = (select(max(count(*)) from emp group by deptno);seh ich das richtig, dass das in mysql nur über temporäre tabellen geht?
Bitte sagt mir, dass ich falsch liege
:confused:
subqueries gehen leider erst ab mysql 4, wenn ich richtig liege.
was genau so denn rauskommen?
gib mal eine beispielausgabe.
mrhappiness 20-01-2003, 17:46 select d.dname, count(e.ename) "Anzahl Mitarbeiter" from dept d, emp e where d.deptno=e.deptno group by d.deptnoliefert:
dname -------- Anzahl Mitarbeiter
ACCOUNTING 2
RESEARCH 5
SALES   6
und ich hätte jetzt gern 1 select, dass mir nur die letzte der drei ergebnisszeilen liefert ohne order und ohne limit
teste das mal
SELECT d.dname, count(e.ename) "Anzahl Mitarbeiter"
FROM emp e
LEFT OUTER JOIN dept d USING(deptno)
group by d.dname
aber eines muss ich jetzt schon sagen. OHNE LIMIT kannst du NICHT auskommen, wenn du nur einen ausschnitt haben willst
habs grad mal auf deiner website getestet... :D so ist es in der ausgabe wie unter oracle
SELECT d.dname, count(e.ename) "Anzahl Mitarbeiter"
FROM emp e
LEFT OUTER JOIN dept d USING(deptno)
WHERE e.deptno != 0
GROUP BY d.dname
mrhappiness 20-01-2003, 19:35 Original geschrieben von Abraxax
habs grad mal auf deiner website getestet... :D so ist es in der ausgabe wie unter oracleschön :D aber das wusste ich auch schon, warum kann ich in mysql denn noch nicht schreiben select max(count(ename)) from emp group by deptno??????????
mrhappiness 20-01-2003, 19:58 und wie mach ich das mit temporären tabellen?$conn=mysql_connect("localhost","streng","geheim");
mysql_select_db("auch_geheim");
mysql_query("CREATE TEMPORARY TABLE dummy(anzahl INT NOT NULL) SELECT count(ename) as anzahl from emp group by deptno");
$result1=mysql_query("select * from dummy",$conn) or die(mysql_error());
while ($row=mysql_fetch_array($result1,MYSQL_ASSOC))
{
echo "-----------<br />";
foreach($row as $key=>$value)
echo "$key: $value<br />";
echo "-----------<br />";
}
mysql_close($conn); will nämlich nicht.
Fehler: Table 'auch_geheim.dummy' doesn't exist
Edit-Tags weg-gemacht, sollte eigentlich eine änderung des beitrags obendrüber sein
geht das überhaupt mit TEMP tables ?
mache mal aus
CREATE TEMPORARY TABLE dummy
das hier
CREATE TABLE dummy
dann ist die aber nicht temp. musst du dann löschen, damit sie temp ist ... :D
mrhappiness 20-01-2003, 22:02 klappt jetzt (in meinem [geposteten] ersten versuch war "anzahl" zweimal vergeben)
hab jetzt in der tabelle dummy die anzahl der mitarbeiter je abteilung (anzahl) und die abteilungsnummer stehen (deptno)
und wie finde ich jetzt davon den größten (inkl. abteilungsname)?
select dummy.anzahl, dummy.deptno, dept.dname from dummy, dept having dummy.anzahl=max(dummy.anzahl)will nich
teste mal so
select dummy.anzahl, dummy.deptno, dept.dname
from dummy, dept
where dept.deptno = dummy.deptno
having dummy.anzahl=max(dummy.anzahl)
mrhappiness 21-01-2003, 22:10 der wählt keine zeilen aus.
so sieht's momentan aus://Verbindung herstellen
$conn=mysql_connect("localhost","name","pass") or die(mysql_error());
echo "Verbindung hergestellt.<br />";
//Datenbank wählen
mysql_select_db("dbname") or die(mysql_error());
echo "Datenbank ausgewählt.<br />";
//Temp. Tabelle anlegen
mysql_query("CREATE TEMPORARY TABLE dummy(id int not null)
SELECT count(ename) as anzahl, e.deptno as deptno
from emp e, dept d
where e.deptno=d.deptno
group by e.deptno, d.dname") or die(mysql_error());
echo "Temporäre Tabelle erstellt.<br />";
//Abfrage
$result1=mysql_query("select dummy.anzahl, dummy.deptno, dept.dname
from dummy, dept
where dept.deptno = dummy.deptno
having dummy.anzahl=max(dummy.anzahl)",$conn) or die(mysql_error());
echo "Temporäre Tabelle abgefragt.<br />";
//Ergebnisanzeige
while ($row=mysql_fetch_array($result1,MYSQL_ASSOC))
{
echo "-----------<br />";
foreach($row as $key=>$value)
echo "$key: $value<br />";
echo "-----------<br />";
}
mysql_close($conn);
echo "Verbindung beendet.<br />";Und das is die AusgabeVerbindung hergestellt.
Datenbank ausgewählt.
Temporäre Tabelle erstellt.
Temporäre Tabelle abgefragt.
Verbindung beendet.
NIcht wirklich ergiebig oder? :(
der fehler muss hier liegen... bin mir jetz aber auch nicht sicher.
echo "-----------<br />";
foreach($row as $key=>$value)
echo "$key: $value<br />";
echo "-----------<br />";
gib das mal classic aus.
echo $row["anzahl"];
mrhappiness 21-01-2003, 22:27 no go
hab mal folgendes eingefügt...
echo "Temporäre Tabelle abgefragt.<br />";
$ergebnis_count=mysql_num_rows($result1);
echo "Anzahl gelieferter Datensätze: $ergebnis_count<br />";und er sagt, es wären 0 Datensätze geliefert worden, also geht er auch gar nicht in die ausgabeschleife (und die ausgabe funktioniert auch nich classic oder mit print_r($row) )
wohl wahr .. :)
liefert die abfrage überhaupt ein ergebnis? z.b. unter phpmyadmin?
wofür verwendest du das 'MYSQL_ASSOC' ?
mrhappiness 21-01-2003, 22:36 auch php-myadmin liefert kein ergebnis, daher würde ich fast wetten, dass die abfrage nich hinhaut, aber warum? :( :confused:
hab das mysql_assoc noch dri, als ich einfach mit print_r ausgegeben hab (hatte da dann jeden wert zweimal; einmal über 0-basierten index und einmal über namen; sozusagen mysql_both :) )
ok. du wolltest doch aber bestimmt die temp-tabelle anfragen. richtig?
zumindest sehe ich das so aufgrund der ausgaben.
warum machst du das nicht?
mrhappiness 22-01-2003, 16:06 Original geschrieben von Abraxax
ok. du wolltest doch aber bestimmt die temp-tabelle anfragen. richtig?
zumindest sehe ich das so aufgrund der ausgaben.
warum machst du das nicht? du siehst aus meinen angaben dass ich die temp tabelle abfragen will und fragst mich warum ich es nicht mache?
Hä bitte? *g*
meine temp tabelle sieht jetzt so aus:
anzahl (der mitarbeiter)
Abteilungsnummer
und ich bin (muss ich zu meiner schande gestehen), nicht in der lage, die id des eintrags mit der höchsten anzahl an mitarbeitern auszulesen :confused:
Original geschrieben von mrhappiness
du siehst aus meinen angaben dass ich die temp tabelle abfragen will und fragst mich warum ich es nicht mache?
Hä bitte? *g*
hatte mich da wohl verguckt. mit der abfrage drüber ... :)
-> from emp e, dept d
mein fehler...
Original geschrieben von mrhappiness
meine temp tabelle sieht jetzt so aus:
anzahl (der mitarbeiter)
Abteilungsnummer
und ich bin (muss ich zu meiner schande gestehen), nicht in der lage, die id des eintrags mit der höchsten anzahl an mitarbeitern auszulesen :confused:
das sollte die lösung sein ... :)
SELECT * FROM DUMMY HAVING anzahl = MAX(anzahl);
mrhappiness 22-01-2003, 17:04 no go.
der liefert mir weder ein ergebnis noch eine fehlermeldung.
wenn ich statt max(anzahl) den höchstwert nehme, nämlich 6 dann geht's, aber dass is ja nich immer so :-(
und es muss doch irgendwie anders gehen, als mit einer abfrage das maximum rauszufinden und dann mit ner zweiten abfrage danachzu suchen oder?
habe jetzt mal eine eigene dummy-tabelle gemacht...
CREATE TABLE dummy (
anzahl int(11) NOT NULL default '0',
nummer int(11) NOT NULL default '0'
) TYPE=MyISAM;
#
# Dumping data for table `dummy`
#
INSERT INTO dummy VALUES (12, 30);
INSERT INTO dummy VALUES (5, 10);
INSERT INTO dummy VALUES (15, 15);
INSERT INTO dummy VALUES (16, 45);
man muss auf jeden fall ein GROUP BY verwenden, wenn man MAX() verwenden möchte.
habe so spontan ohne subquery keine lösung parat.
nur die hier, aber ihr kennt ja offiziell noch kein LIMIT, oder wie war das? :D
SELECT nummer,anzahl FROM dummy ORDER BY anzahl DESC LIMIT 1;
oder eben mit der besagten zweiten abfrage.
# anfrage was MAX() ist????
SELECT MAX(anzahl) FROM dummy;
# zweite abfrage mit anzahl aus erster abfrage.
SELECT nummer,anzahl FROM dummy WHERE anzahl = '$anzahl_rueckgabe_der_ersten_query';
aber da hast du schon zwei querys.... :(
mrhappiness 22-01-2003, 17:44 auf jeden fall mal danke für deine hilfe
werd's wohl mit 2 querys machen :-(
wenn du es dennoch mit einer Q schaffen solltest ..... => POSTEN ... :D
mrhappiness 22-01-2003, 17:51 versprochen :D
|
-
- |