PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Zwei Aggregatfunktionen in JOIN über drei Tabellen (http://www.selfphp.de/forum/showthread.php?t=16417)

Nico #949494 22.03.2007 19:09:10

Zwei Aggregatfunktionen in JOIN über drei Tabellen
 
Guten Abend,

mein Problem ist folgendes: Ich habe drei Tabellen, die ich mittels JOIN verbinde. Die erste Tabelle enthält Datensätze, die zweite Kommentare dazu und die dritte Noten/Bewertungen zu den Datensätzen.

Mein erster Befehl lautete:

Code:

SELECT ideas.IID, AVG(SCORE) AS PUNKTE, ideas.COMPANY, COUNT(comments.CID)

FROM ideas LEFT JOIN comments on comments.IID = ideas.IID LEFT JOIN ratings ON ideas.IID = ratings.IID

GROUP BY comments.CID

und ich erhielt
Code:

#-----#------------#---------#------------#
| IID | AVG(SCORE) | COMPANY | COUNT(CID) |
#-----#------------#---------#------------#
| 1  | 1.0000    | a      | 2          |
| 2  | 4.5000    | b      | 2          |
| 3  | 0.0000    | c      | 2          |
| ... | ...        | ...    | ...        |
| 9  | 9.0000    | e      | 4          |
| 11  | NULL      | d      | 0          |
#-----#------------#---------#------------#

Das schien richtig, ist es aber nicht. In Wirklichkeit hat "b" nämlich nur einen Kommentar, nicht zwei - mein Beispiel ist gekürzt, es trat noch in anderen Zeilen auf.

Dann habe ich was anderes versucht, einen Schritt zurück:

Code:

SELECT ideas.IID, COMPANY, COUNT(CID)

FROM comments LEFT JOIN ratings ON comments.IID = ratings.IID LEFT JOIN ideas ON ideas.IID = comments.IID

GROUP BY comments.CID

und erhielt
Code:

#-----#---------#------------#
| IID | COMPANY        | COUNT(CID) |
#-----#---------#------------#
| 1  |        a        | 1            |
| 1  |        a        | 1          |
| 2  |        b        | 2          |
| ... | ...    | ...        |
| 9  |        e        | 1            |
| 9  |        e        | 1            |
| 9  |        e        | 1            |
| 9  |        e        | 1            |
#-----#---------#------------#

Schon besser, denn hier kann man sehen, dass "b" tatsächlich nur einen Kommentar zugeordnet bekommen hat. Nur: Die Zahl in der Spalte COUNT(CID) entspricht nicht der Wahrheit, vielmehr sollte jede IID nur einmal vorkommen und die Anzahl der gleichen IIDs gleich der Spalte COUNT(CID) sein, dann würde es stimmen.

Wie bekomme ich das jetzt nur hin (und die AVG(SCORE)-Spalte danach wieder)?

Bin ich total auf dem Holzweg? Reichen euch diese Informationen?

Vielen Dank für eure Hilfe!

Nico #949494 29.03.2007 14:47:58

AW: Zwei Aggregatfunktionen in JOIN über drei Tabellen
 
Habe die Lösung selber gefunden:

Code:

SELECT ideas.IID, AVG(SCORE) AS PUNKTE, ideas.COMPANY, COUNT(distinct comments.CID)

FROM ideas LEFT JOIN comments on comments.IID = ideas.IID LEFT JOIN ratings ON ideas.IID = ratings.IID

GROUP BY comments.CID

Mit dem DISTINCT stimmts.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:54:53 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.