MySQL SQL Problem

Gsus

schwankend^^
ID: 215354
L
22 Mai 2006
1.553
68
Hallo,

ich habe heute von der Uni aus eine Aufgabe bekommen, in der es darum geht, aus folgender Tabelle:
PRES_NAME|HOBBY
Adams J Q|Billiards
Adams J Q|Swimming
Adams J Q|Walking
Arthur C A|Fishing
Cleveland G|Fishing
Coolidge C|Fishing
Coolidge C|Golf
Coolidge C|Indian Clubs
Coolidge C|Mechanical Horse
Coolidge C|Pitching Hay
Eisenhower D D|Bridge
Eisenhower D D|Golf
...|...
Das Hobby auszulesen, dass am meisten ausgeführt wird, zusammen mit den Namen der Presidenten, die dieses Hobby ausüben.

Mein Ansatz war nun der folgende:
Code:
SELECT HOBBY, PRES_NAME FROM PRES_HOBBY GROUP BY HOBBY HAVING COUNT(*) = MAX(COUNT(*))
Dabei bekomme ich allerdings immer den Fehler: Nested aggregate functions are not allowed

Folgender Ansatz war das mit einem Subquery zu lösen:
Code:
SELECT HOBBY, COUNT(*) FROM PRES_HOBBY H GROUP BY HOBBY HAVING COUNT(*) = MAX((SELECT COUNT(*) FROM PRES_HOBBY GROUP BY HOBBY))
Dabei kommt der Fehler: multiple rows in singleton select

An dieser Stelle komme ich leider nicht mehr weiter. Ich möchte keine Explizite Lösung zu dem Problem haben, da mir das beim lernen nicht wirklich weiter helfen würde, aber ein kleiner Anstoß, wie man dieses Problem lösen könnte wäre doch sehr hilfreich.

Vielen dank im Vorraus!

mfg
Gsus
 
hmm:

MAX((SELECT COUNT(*)
versuch mal
(SELECT (MAX COUNT(*))


allerdings könntest Du auch nach dem COUNT(*) absteigend sortieren und dann nur die erste Zeile berücksichtigen ( funktioniert aber nur, wenn es nicht zwei Hobbies gibt, die gleich häufig ausgeführt werden )





sowas könnte auch funktionieren:

PHP:
SELECT HOBBY, PRES_NAME 
FROM PRES_HOBBY 
WHERE HOBBY IN
( SELECT HOBBY
FROM PRES_HOBBY
GROUP BY HOBBY
ORDER BY COUNT(*) DESC
FETCH FIRST ROW ONLY )


oder exotischer:
PHP:
SELECT A.HOBBY, A.PRES_NAME 
FROM PRES_HOBBY A INNER JOIN
( SELECT HOBBY , COUNT(*) AS CNT
FROM PRES_HOBBY
GROUP BY HOBBY ) B
ON A.HOBBY = B.HOBBY
WHERE B.CNT >= ALL
( SELECT COUNT(*) 
FROM PRES_HOBBY
GROUP BY HOBBY ) C
 
Zuletzt bearbeitet:
vielen Dank!

Das erste Statement liefert genau das gleiche Problem mit verschachtelten Funktionen, das zweite einen Error wegen dem FETCH, aber das dritte funktioniert! Leider kann das nicht unbedingt die richtige antwort sein, weil wir den INNER JOIN noch nicht behandelt haben, und das eine Reflexionsaufgabe gewesen sein soll aber nunja ;)

Vielen Dank auf jeden Fall für deine Hilfe!

mfg
Gsus
 
Evtl keine schöne Lösung aber klappt :mrgreen:
PHP:
SELECT hobby, GROUP_CONCAT(pres_name), COUNT(*) FROM pres_hobby GROUP BY HOBBY ORDER BY COUNT(*) DESC
 
Evtl keine schöne Lösung aber klappt :mrgreen:
PHP:
SELECT hobby, GROUP_CONCAT(pres_name), COUNT(*) FROM pres_hobby GROUP BY HOBBY ORDER BY COUNT(*) DESC
zumindest bei MySQL :D Darum gehts hier aber leider nicht, es gab nur kein reines SQL bei der Präfix-Auswahl ;)

Dynamic SQL Error
SQL error code = -804
Function unknown
GROUP_CONCAT

Da aber auch kein anderer Mitstudent diese Aufgabe lösen konnte mit den Mitteln die wir kennen, werde ich diese Aufgabe einfach mal so stehenlassen und schauen was mein Dozent morgen dazu zu sagen hat ;)

Trotzdem vielen Dank für den Versuch!

mfg
Gsus
 
  • Like
Reaktionen: Xot
Wenn ich dich nicht total falsch verstanden habe, ist das dein Query, den du suchst.

PHP:
SELECT PRES_NAME, HOBBY FROM pres_hobby WHERE HOBBY = (SELECT HOBBY FROM pres_hobby  GROUP BY HOBBY ORDER BY count(*) DESC LIMIT 1)

bzw. wenn ihr HAVING schon hattet, dann wäre

PHP:
SELECT PRES_NAME, HOBBY FROM pres_hobby WHERE HOBBY IN (
  SELECT HOBBY FROM pres_hobby GROUP BY HOBBY HAVING count(*) >= (
    SELECT count(*) FROM pres_hobby GROUP BY HOBBY ORDER BY count(*) DESC LIMIT 1
  ) 
)

besser, weil er dann alle Treffer listen kann.
 
Zuletzt bearbeitet: