Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
max(count())= [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




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)

 
Günni
20-01-2003, 10:02 
 
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)

 
Abraxax
20-01-2003, 11:11 
 
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)

 
Abraxax
20-01-2003, 14:19 
 
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:

 
Abraxax
20-01-2003, 17:33 
 
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  &nbsp           6
und ich hätte jetzt gern 1 select, dass mir nur die letzte der drei ergebnisszeilen liefert ohne order und ohne limit

 
Abraxax
20-01-2003, 17:55 
 
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

 
Abraxax
20-01-2003, 20:58 
 
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

 
Abraxax
21-01-2003, 10:40 
 
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&auml;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&auml;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? :(

 
Abraxax
21-01-2003, 22:18 
 
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) )

 
Abraxax
21-01-2003, 22:31 
 
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 :) )

 
Abraxax
21-01-2003, 22:50 
 
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:

 
Abraxax
22-01-2003, 16:34 
 
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?

 
Abraxax
22-01-2003, 17:26 
 
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 :-(

 
Abraxax
22-01-2003, 17:49 
 
wenn du es dennoch mit einer Q schaffen solltest ..... => POSTEN ... :D

 
mrhappiness
22-01-2003, 17:51 
 
versprochen :D

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:13 Uhr.