Antwort
 
Themen-Optionen
Alt 31.08.2006, 14:22 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Probleme mit kniffligen Query über 3 Tabellen

Tag,
ich hab hier ein Problem mit einem MySQL-Query welcher sich über insgesamt 3 Tabellen erstreckt. Dabei will ich folgendes erreichen:
* gameID, gameName usw.. aus der angegebenen Kategorie auslesen
* den User mit der höchsten Punktzahl bei diesem Spiel auswählen

Mein Query sieht derzeit so aus:
Code:
SELECT
        gl.gameID, gl.gameName, gl.gamePath, gl.gamePicture,
        MAX(s.score) AS maxScore, s.userID, u.name AS username
FROM
        backend_gamesarea_gamelist AS gl
LEFT JOIN
        backend_gamesarea_scorelist AS s
ON
        s.gameID = gl.gameID
LEFT JOIN
        backend_usertable AS u
ON
        u.id = s.userID
WHERE
        gl.categoryID = '1'
GROUP BY
        gl.gameID
ORDER BY
        gl.gameID ASC
Ich bin schon relativ nahe dran an meinem gewünschten Ergebnis, bis auf eine Sache: Es wird die falsche userID ausgewählt. Denn in der Tabelle backend_gamesarea_scorelist steht der User mit der ID 3 bei der höchsten punktzahl, als Ergebnis bekomme ich allerdings den ersten User, den MySQL in der Tabelle findet.

Was ich also brauche ist noch irgendein Befehl oder eine Weise, wie ich die userID auswählen kann, die zu dem höchsten score (MAX(s.score)) gehört. Mein Kunde hat die MySQL Version 4.0.15, SubSelects werden aber erst ab 4.1 unterstützt, sonst hätte ich das Problem schon längst so gelöst.. Jemand ne Idee?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 14:34 Nach oben    #2
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Zitat:
Was ich also brauche ist noch irgendein Befehl oder eine Weise, wie ich die userID auswählen kann, die zu dem höchsten score (MAX(s.score)) gehört.
Wenn ich das jetzt nicht falsch verstanden habe, dann brauchst du einfach ein ORDER BY maxScore, denn dann ist der User als erster dran, der auch die meiste Score hat...
Damit du dann aber auch nicht 100 Ergebnisse bekommst wenn du nur eins haben willst, verwende noch LIMIT 1
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 14:44 Nach oben    #3
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
Zitat:
Was ich also brauche ist noch irgendein Befehl oder eine Weise, wie ich die userID auswählen kann, die zu dem höchsten score (MAX(s.score)) gehört.
Wenn ich das jetzt nicht falsch verstanden habe, dann brauchst du einfach ein ORDER BY maxScore, denn dann ist der User als erster dran, der auch die meiste Score hat...
Damit du dann aber auch nicht 100 Ergebnisse bekommst wenn du nur eins haben willst, verwende noch LIMIT 1
Naja ich les das in einer Schleife aus, ich bruach schon alle Spiele in der Kategorie. Das ORDER BY brachte aber leider nicht das gewünschte Ergebnis. Hier mein bisheriges Ergebnis mit meinem Query:
Code:
 gameID  gameName   	  gamePath   	                         gamePicture   	                       maxScore userID  username
1 	Bomberman 	./games/abenteuer/bomberman.swf 	./games/abenteuer/bomberman.gif 	NULL 	NULL 	NULL
2 	Streets of fire ./games/abenteuer/streetsoffire.swf 	./games/abenteuer/streetsoffire.gif 	9999 	1 	webmaster
3 	Indianajones 	./games/abenteuer/indianajones.swf 	./games/abenteuer/indianajones.gif 	NULL 	NULL 	NULL
4 	Megaman 	./games/abenteuer/megaman.swf 	        ./games/abenteuer/megaman.gif 	       NULL 	NULL 	NULL
5 	Links Rupee Madness ./games/abenteuer/zeldaruppee.swf 	./games/abenteuer/zeldaruppee.gif 	NULL 	NULL 	NULL
NULL kommt daher, da noch nicht genug DummyDaten existieren. Derzeit existieren nur 2 DummyDaten in der backend_gamesarea_scorelist, einmal
userID 3 mit score 9999 bei gameID 2 und
userID 1 mit score 123 bei gameID 2

Leider wird (wie oben ersichtlich) userID 1 gewählt, obwohl userID 3 richtig wäre..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 19:09 Nach oben    #4
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Keine eine Lösung für mein Problem? Es eilt ein bisschen, und ich kriegs einfach nich hin =/
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 20:59 Nach oben    #5
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 521
Standard

wenns eilt nimm halt ein zweites query...
hab auch ka wie das ohne subselects möglich is.
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 21:11 Nach oben    #6
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Wir haben darüber auch grade gebrütet und es geht leider nicht, da er unter Where/On kein Max() erlaubt.
Chr!s wirds wohl auch mit 2 Querys machen müssen. Aber definitiv ein Grund, sein MySQL zu aktualisieren.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 21:45 Nach oben    #7
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Wir haben darüber auch grade gebrütet und es geht leider nicht, da er unter Where/On kein Max() erlaubt.
Chr!s wirds wohl auch mit 2 Querys machen müssen. Aber definitiv ein Grund, sein MySQL zu aktualisieren.
Ist nicht meins, ist das vom Kunden.. Bei mir läuft mysql 5

Danke nochmal für die Hilfe, ich kriegs auch nicht anders als mit 2 Queries hin..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.08.2006, 22:02 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Dann soll der Kunde das halt aktualisieren.
Ich kann es bald nicht mehr hören .. "der Kunde" .. "das geht da nicht" .. ..
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.09.2006, 06:14 Nach oben    #9
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

@Ben: Der Kunde ist nunmal König. Das war schon immer so und das wird auch immer so bleiben. Und wenn der Kunde ein Hello-World-Script für 500 Euro kaufen will, dann soll er dies auch tun. Mehr als es dem Kunden anraten kann man nunmal nicht, wenn er aber auf gute Begründungen nicht eingeht, hat man als Programmierer halt das Nachsehen oder man sagt ihm dann, dass man das Projekt nicht annehmen kann/will und das Geld fließt in die Taschen eines anderen Entwicklers, dem es eben scheißegal ist, was der Kunde für ne Version benutzen will.

EDIT: Zum Thema selbst fällt mir gerade ein, dass ich das selbe Problem bei meinem Forum hatte: Eine Tabelle für die Foren, eine für die Threads und eine für die Posts. Glaubst du es hat funktioniert in einem (!!) Query (ohne Subqueries, die gab es damals noch nicht), eine Foren-Übersicht auszulesen, in der dann der letzte Post mit User per Join angezeigt wurde? Es war schlichtweg nicht möglich. Man bekam immer mal irgendeinen Post / User heraus, aber nie den neuesten (komischerweise war es aber auch nie der Selbe!?).

Ich musste dann umsteigen und temporäre Spalten für DATETIME, PostID, ThreadID und UserID in den anderen Tabellen anlegen
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll

Geändert von MrNiceGuy (01.09.2006 um 06:18 Uhr).
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.09.2006, 10:02 Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 146
Standard

Hallo,

also die Query arbeitet völlig korrekt. Ich vermute mal, Du suchst so eine Abfrage:

Code:
SELECT 
        gl.gameID, 
        gl.gameName,
        gl.gamePath, 
        gl.gamePicture, 
        sa.score as maxScore, 
        sa.userID, 
        u.name as username
FROM
        backend_gamesarea_gamelist AS gl
LEFT JOIN
	(
	SELECT
 		s.userID, 
                 s.gameID, 
                 s.score
	FROM
		(
		SELECT 
                         MAX( score) as maxscore, 
                         gameID 
                 FROM
                         backend_gamesarea_scorelist 
                 GROUP BY 
                         gameID
		) AS a,
	        backend_gamesarea_scorelist AS s
	WHERE
		s.score = a.maxscore AND s.gameID = a.gameID
	) AS sa
ON
	sa.gameID = gl.gameID
LEFT JOIN
        backend_usertable AS u
ON
        u.id = sa.userID
WHERE
        gl.categoryID = '1'
GROUP BY
        gl.gameID
ORDER BY
        gl.gameID ASC
Gruß,
Jumper, the II.

Geändert von JumperII (01.09.2006 um 10:05 Uhr).
JumperII ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.09.2006, 10:12 Nach oben    #11
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Zitat:
Zitat von Chr!s Beitrag anzeigen
Mein Kunde hat die MySQL Version 4.0.15, SubSelects werden aber erst ab 4.1 unterstützt, sonst hätte ich das Problem schon längst so gelöst..
Zitat:
Zitat von JumperII
Ich vermute mal, Du suchst so eine Abfrage:
Ohne Subselects und schon wäre es schön
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.09.2006, 11:41 Nach oben    #12
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 146
Standard

Ups ... mir entgangen, dass es erst sei t 4.1 drin ist ... naja, dann empfehle ich, die Anwendung umzuprogrammieren. Einfach eine zusätzliche Tabelle mit dem highscore eines spieles mit verwalten.
Alternativ natürlich n Abfragen, für n Spiele ....

Ansonsten kannst Du probieren, einen primären Schlüssel auf die score-table zu setzen, bei der nach gameID+score+userid sortiert wird. Dann könnte der JOIN ausversehen das richtige Element rausgeben.

// EDIT: Ich hab es mal bei einer testdatenbank bei mir getestet ... allerdings unter 5.0 ....
Code:
SELECT
        gl.gameID, gl.gameName, gl.gamePath, gl.gamePicture,
        s.score AS maxScore, s.userID, u.name AS username
FROM
        backend_gamesarea_gamelist AS gl
LEFT JOIN
        backend_gamesarea_scorelist AS s
ON
        s.gameID = gl.gameID
LEFT JOIN
        backend_usertable AS u
ON
        u.id = s.userID
WHERE
        gl.categoryID = '1'
GROUP BY
        gl.gameID
ORDER BY
        gl.gameID ASC
und als score-table:
Code:
CREATE TABLE `backend_gamesarea_scorelist` (
  `userID` int(11) NOT NULL,
  `score` bigint(20) NOT NULL,
  `gameID` int(11) NOT NULL,
  PRIMARY KEY  (`gameID`,`score`,`userID`)
)
Bei mir funktioniert es.
Code:
gameID  gameName            gamePath                            gamePicture                         maxScore  userID  username  
1       Bomberman           ./games/abenteuer/bomberman.swf     ./games/abenteuer/bomberman.gif     NULL      NULL    NULL 
2       Streets of fire     ./games/abenteuer/streetsoffire.swf ./games/abenteuer/streetsoffire.gif 123       1       webmaster 
3       Indianajones        ./games/abenteuer/indianajones.swf  ./games/abenteuer/indianajones.gif  NULL      NULL    NULL 
4       Megaman             ./games/abenteuer/megaman.swf       ./games/abenteuer/megaman.gif       NULL      NULL    NULL 
5       Links Rupee Madness ./games/abenteuer/zeldaruppee.swf   ./games/abenteuer/zeldaruppee.gif   NULL      NULL    NULL
Gruß,
Jumper, the II.

Geändert von JumperII (01.09.2006 um 11:58 Uhr).
JumperII ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.09.2006, 14:27 Nach oben    #13
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Du kriegst zwar die richtige User-ID, aber den falschen Score-Datensatz.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.09.2006, 12:35 Nach oben    #14
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 146
Standard

Stimmt ... bliebe noch die Lösung, ohne MAX( score) und Group By auszukommen und die Sortierung nach GameID und Score desc zu setzen .... dann ist es im Resultat immer der erste Eintrag zur GameID ...

Gruß,
Jumper, the II.
JumperII ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
query umschreiben nibblas Datenbanken 5 04.07.2007 16:41
Datensaetze aus 2 Tabellen mit java klasse abfragen Aristotelis Datenbanken 7 31.05.2007 09:40
MySQL Fehlermeldung: Your query requires a full tablescan ... Chr!s Datenbanken 12 31.07.2006 21:45
Query verbessern? björn Datenbanken 4 05.06.2006 13:48
Probleme mit Tabellen Bookworm HTML, XML und CSS 10 28.12.2005 13:56


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:09 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44