Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-07-2010, 20:09   #1 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
[MySql] Join/Sum falsche Ergebnisse

Hi =)

Es gibt eine user-table (User) und 3 Tutorial-Tables (Text, Video und Other).

Jedes Tutorial hat die Attibute rating_positive and rating_negative
und ist über eine user_id eindeutig einem User zugeordnet.

Ich möchte die 10 besten User mit den meisten Tutorials haben und dazu noch die summe der Bewertungen ihrer Tutorials positiv und negativ.

Ich habe das hier versucht, da kommen zwar die richtigen User bei raus, aber die Werte für die summe der Tutorials und der Bewertungen ist viel zu hoch (ca 375 mal so hoch, wie sie sein sollten..)

Code:
SELECT
	u.id AS user_id,
	(COUNT(t.id) + COUNT(v.id) + COUNT(o.id)) AS tutorials_count, 
	(SUM(t.rating_positive) + SUM(v.rating_positive) + SUM(o.rating_positive)) AS pos,
	(SUM(t.rating_negative) + SUM(v.rating_negative) + SUM(o.rating_negative)) AS neg
FROM 
	user u LEFT JOIN trick t ON u.id = t.submitter_id
LEFT JOIN video v ON u.id = v.submitter_id
LEFT JOIN other o ON u.id = o.submitter_id
GROUP BY u.id
ORDER BY tutorials_count DESC
LIMIT 10
Was mache ich falsch?

Grüße
pape

Geändert von pape (05-07-2010 um 20:10 Uhr)
pape ist offline   Mit Zitat antworten
Alt 05-07-2010, 23:19   #2 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Ganz spontan: Nimm mal statt LEFT JOIN ein normales JOIN …
__________________
RTFM
Wie man Fragen richtig stellt.

Achim Bindannmalweg

Money makes the world go round, fear makes it turn much faster.
(New Model Army)
sonar ist gerade online   Mit Zitat antworten
Alt 05-07-2010, 23:31   #3 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
Hi,

was genau meinst du mit "normales Join"?
Wenn ich das Schlüsselwort "LEFT" weg lasse bekomme ich die gleichen Ergebnisse.

Das hier:
Code:
SELECT
	u.id AS user_id,
	(COUNT(t.id) + COUNT(v.id) + COUNT(o.id)) AS tutorials_count, 
	(SUM(t.rating_positive) + SUM(v.rating_positive) + SUM(o.rating_positive)) AS pos,
	(SUM(t.rating_negative) + SUM(v.rating_negative) + SUM(o.rating_negative)) AS neg

FROM user u, trick t, video v, other o
WHERE u.id = t.submitter_id
AND u.id = v.submitter_id
AND u.id = o.submitter_id
GROUP BY u.id
ORDER BY tutorials_count DESC
LIMIT 10
liefert auch die gleichen (falschen) Ergebnisse.

Geändert von pape (05-07-2010 um 23:33 Uhr)
pape ist offline   Mit Zitat antworten
Alt 06-07-2010, 03:17   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
da ist ein Logikfehler in deinem Query. da gehören gar keine Joins rein.

versuch es mal so:
Code:
SELECT
  submitter_id AS user_id,
  COUNT(*) AS tutorials_count,
  SUM(rating_positive) AS pos,
  SUM(rating_negative) AS neg
FROM (
    SELECT submitter_id, rating_positive, rating_negative FROM trick
    UNION ALL
    SELECT submitter_id, rating_positive, rating_negative FROM video
    UNION ALL
    SELECT submitter_id, rating_positive, rating_negative FROM other
  ) AS temptable_all_tutorials
GROUP BY user_id
ORDER BY tutorials_count DESC
LIMIT 10;
wieso hast du die Daten eigentlich auf drei Tabellen verteilt? unterscheiden sie sich in den weiteren Spalten? oder lediglich wegen der bedeutung der Inhalte?
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 06-07-2010, 07:53   #5 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
Hi & Danke!

Der Query liefert die richtigen Ergebnisse und leuchtet mir auch ein. :-)

Wenn ich nun aber noch u.* (also alle User-Daten) will, dann brauche ich noch einen Join mit der user-table.

Danke!

Zitat:
wieso hast du die Daten eigentlich auf drei Tabellen verteilt? unterscheiden sie sich in den weiteren Spalten? oder lediglich wegen der bedeutung der Inhalte?
ganz genau. :-)
Zudem liegt noch ein ORM dazwischen (Doctrine).

Beste Grüße
pape

Geändert von pape (06-07-2010 um 07:55 Uhr)
pape ist offline   Mit Zitat antworten
Alt 06-07-2010, 08:18   #6 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Wenn ich nun aber noch u.* (also alle User-Daten) will, dann brauche ich noch einen Join mit der user-table.
ja.
Nur für die Daten aus deinem bisherigen Query war es halt nicht notwendig.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Upload Listener liefert falsche Ergebnisse mirzahat ActionScript 2 4 13-02-2007 10:53
[mySQL] suche - vorschau der ergebnisse dassoud PHP und MySQL 3 03-05-2006 18:41
mysql - gerade/ungerade ergebnisse anders darstellen redman PHP und MySQL 6 11-08-2004 21:09
JOIN :: MySQL alexpetri PHP und MySQL 8 01-06-2004 13:34
warum liefert array.sort falsche ergebnisse?? Rudi Ratlos ActionScript 1 5 16-07-2002 17:00


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele