Query - aber wie?

Query - aber wie?

am 22.05.2007 18:33:58 von Michael Kuroll

Hallo dcdm!

Ich suche nach einem möglichen Query für mein Problem, komme aber nicht mal
ansatzweise auf einen grünen Zweig.

Folgende Tabelle ist gegeben:

CREATE TABLE `gameplayer` (
`gameplayer_id` int(11) NOT NULL auto_increment,
`gameplayer_gamesid` int(11) NOT NULL default '0',
`gameplayer_userid` int(11) NOT NULL default '0',
`gameplayer_einsatz` decimal(11,0) NOT NULL default '0',
`gameplayer_gewinn` decimal(11,0) NOT NULL default '0',
`gameplayer_rang` int(5) NOT NULL default '0',
PRIMARY KEY (`gameplayer_id`)
) TYPE=MyISAM

MySQL Version: 4.024 (könnte aber im schlimmsten Fall upgedatet werden)

Gefragt sind alle Spieler (gameplayer_userid) die bei einem Poker Spiel "on
the Bubble" (= der erste Rang ausserhalb des Gewinns) ausgeschieden ist.

d.h. der höchste gameplayer_rang bei gameplayer_gewinn=0 zu einer
gameplayer_gamesid.

Wie mache ich das am einfachsten?

Vielen Dank, liebe Grüße
Mike

Re: Query - aber wie?

am 22.05.2007 22:58:00 von Joachim Zobel

Am Dienstag, den 22.05.2007, 18:33 +0200 schrieb Michael Kuroll:
> CREATE TABLE `gameplayer` (
> `gameplayer_id` int(11) NOT NULL auto_increment,
> `gameplayer_gamesid` int(11) NOT NULL default '0',
> `gameplayer_userid` int(11) NOT NULL default '0',
> `gameplayer_einsatz` decimal(11,0) NOT NULL default '0',
> `gameplayer_gewinn` decimal(11,0) NOT NULL default '0',
> `gameplayer_rang` int(5) NOT NULL default '0',
> PRIMARY KEY (`gameplayer_id`)
> ) TYPE=3DMyISAM
>=20
> MySQL Version: 4.024 (könnte aber im schlimmsten Fall upgedatet werden)
>=20
> Gefragt sind alle Spieler (gameplayer_userid) die bei einem Poker Spiel "=
on
> the Bubble" (=3D der erste Rang ausserhalb des Gewinns) ausgeschieden ist=
..
>=20
> d.h. der höchste gameplayer_rang bei gameplayer_gewinn=3D0 zu einer
> gameplayer_gamesid.

Da ist er wieder, Left Join, der Superheld:

SELECT gp.*
FROM gameplayer gp
LEFT JOIN gameplayer nex
ON gp.gameplayer_gamesid =3D nex.gameplayer_gamesid
AND gp.gameplayer_rang < nex.gameplayer_rang
AND nex.gameplayer_gewinn =3D 0
WHERE nex.gameplayer_id IS NULL

sollte dies tun. D.h. es gibt zur jeweiligen gamesid keinen
höherrangigen mit gewinn =3D 0.

Gruß,
Joachim

Re: Query - aber wie?

am 22.05.2007 23:06:24 von Michael Kuroll

Am Tue, 22 May 2007 22:58:00 +0200 schrieb Joachim Zobel:

Hallo Joachim!

>> Gefragt sind alle Spieler (gameplayer_userid) die bei einem Poker Spiel "on
>> the Bubble" (= der erste Rang ausserhalb des Gewinns) ausgeschieden ist.
>> d.h. der höchste gameplayer_rang bei gameplayer_gewinn=0 zu einer
>> gameplayer_gamesid.

> Da ist er wieder, Left Join, der Superheld:

Das ist er in der tat ;)

> SELECT gp.*
> FROM gameplayer gp
> LEFT JOIN gameplayer nex
> ON gp.gameplayer_gamesid = nex.gameplayer_gamesid
> AND gp.gameplayer_rang < nex.gameplayer_rang
> AND nex.gameplayer_gewinn = 0
> WHERE nex.gameplayer_id IS NULL

> sollte dies tun. D.h. es gibt zur jeweiligen gamesid keinen
> höherrangigen mit gewinn = 0.

Tut es auch perfekt.
Vielen Dank dafür!

Auf die Gefahr hin unverschämt zu werden:
Gibt es eine Möglichkeit das Ganze so zu verändern, dass ich nur mehr die
Userids (jede nur einmal (group by?!?) und die Anzahl der "on the bubble"
Plätze erhalte?

Vielen Dank nochmals, lg
Mike

P.S.: Ich such mir jetzt mal ne ordentliche Doku über diese Joins...

Re: Query - aber wie?

am 22.05.2007 23:16:54 von Michael Kuroll

Am Tue, 22 May 2007 23:06:24 +0200 schrieb Michael Kuroll:

> Auf die Gefahr hin unverschämt zu werden:
> Gibt es eine Möglichkeit das Ganze so zu verändern, dass ich nur mehr die
> Userids (jede nur einmal (group by?!?) und die Anzahl der "on the bubble"
> Plätze erhalte?

Ich hab jetzt ein wenig herumgetestet. Kann das so stimmen?

SELECT gp.gameplayer_userid, count(gp.gameplayer_id)
FROM gameplayer gp
LEFT JOIN gameplayer nex
ON gp.gameplayer_gamesid = nex.gameplayer_gamesid
AND gp.gameplayer_rang < nex.gameplayer_rang
AND nex.gameplayer_gewinn = 0
WHERE nex.gameplayer_id IS NULL
GROUP BY gp.gameplayer_userid

Danke, lg
Mike