Hilfe bei komplizierten Unterabfragen
Hilfe bei komplizierten Unterabfragen
am 14.01.2006 14:45:02 von Hans-Peter Sauer
Moin Gruppe,
folgende Tabelle (t) sei gegeben:
+-----+----+---+-----+
| vid | id | d | var |
+-----+----+---+-----+
| 1 | 0 | n | a |
| 2 | 0 | n | b |
| 3 | 0 | y | c |
| 1 | 1 | n | d |
| 2 | 1 | n | e |
| 4 | 2 | n | f |
+-----+----+---+-----+
Der Schlüssel sind vid und id. d ist ein enum('y','n') und var steht fü=
r
irgendeinen Inhalt.
Ich brauche eine Abfrage, welche mir für jede id, den Datensatz mit der=
größten vid liefert. Aber nur, wenn d =3D 'n'.
Für die o.g. Tabelle wäre das:
+-----+----+---+-----+
| vid | id | d | var |
+-----+----+---+-----+
| 2 | 1 | n | e |
| 4 | 2 | n | f |
+-----+----+---+-----+
Ich bin soweit, dass ich für eine einzelne id mit folgender Abfrage
(z.B. für id =3D 0) das gewünschte hinbekomme.
SELECT * FROM
(SELECT * FROM `t` WHERE `id` =3D 0 AND `vid` >=3D ALL
(SELECT `vid` FROM `t` WHERE `id` =3D 0))
AS bla WHERE `d` =3D 'n'
(SELECT * dient nur zur Vereinfachung :) )
Kann mir jemand helfen, eine Abfrage zu bekommen, die mir sofort
das gewünschte Ergebnis liefert? Also alle passenden Datensätze.
Vielleicht auch für MySQL < 4.1, also ohne Subqueries mit ALL oder ANY.=
Grüße,
Edvin Pehlivanovic
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 15:18:41 von Hartmut Holzgraefe
Edvin Pehlivanovic wrote:
> folgende Tabelle (t) sei gegeben:
>=20
> +-----+----+---+-----+
> | vid | id | d | var |
> +-----+----+---+-----+
> | 1 | 0 | n | a |
..
> Ich brauche eine Abfrage, welche mir für jede id, den Datensatz mit d=
er
> größten vid liefert. Aber nur, wenn d =3D 'n'.
SELECT *
FROM t
WHERE (vid,id) IN (SELECT MAX(vid) AS vid
, id
FROM t
WHERE d=3D'n'
GROUP BY id);
> Für die o.g. Tabelle wäre das:
>=20
> +-----+----+---+-----+
> | vid | id | d | var |
> +-----+----+---+-----+
> | 2 | 1 | n | e |
> | 4 | 2 | n | f |
> +-----+----+---+-----+
nein, da fehlt id=3D0
+------+------+------+------+
| vid | id | d | a |
+------+------+------+------+
| 2 | 0 | n | b |
| 2 | 1 | n | e |
| 4 | 2 | n | f |
+------+------+------+------+
> Vielleicht auch für MySQL < 4.1, also ohne Subqueries mit ALL oder AN=
Y.
Das geht dann nur in mehreren Schritten:
CREATE TEMPORARY TABLE tmp1
SELECT MAX(vid) AS vid
, id
FROM t
WHERE d=3D'n'
GROUP BY id;
SELECT t.* FROM t JOIN tmp1 USING (vid,id);
DROP TABLE tmp1;
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 17:44:48 von Hans-Peter Sauer
Hartmut Holzgraefe wrote:
> Edvin Pehlivanovic wrote:
>=20
>> folgende Tabelle (t) sei gegeben:
>>
>> +-----+----+---+-----+
>> | vid | id | d | var |
>> +-----+----+---+-----+
>> | 1 | 0 | n | a |
>=20
> ...
>=20
>> Ich brauche eine Abfrage, welche mir für jede id, den Datensatz mit =
der
>> größten vid liefert. Aber nur, wenn d =3D 'n'.
>> Für die o.g. Tabelle wäre das:
>>
>> +-----+----+---+-----+
>> | vid | id | d | var |
>> +-----+----+---+-----+
>> | 2 | 1 | n | e |
>> | 4 | 2 | n | f |
>> +-----+----+---+-----+
>=20
>=20
> nein, da fehlt id=3D0
Sorry, dass es missverständlich war, aber id=3D0 fehlt nicht, da bei id=
=3D0
die größte vid=3D3 ist, allerdings dort d=3Dy ist.
Ich braucht _nicht_ die Datensätze mit der größten vid (pro id) wo =
d=3Dn,
sondern nur die Datensätze mit vid ist maximal _und_ d=3Dn. Also wenn
vid maximal ist aber d=3Dy, dann soll der DS nicht in der Ergebnismenge
sein.
Ich danke Dir für Deine bisherigen Mühe. Vielleicht hast Du ja noch
weitere Ideen.
Grüße,
Edvin Pehlivanovic
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 18:02:03 von Hartmut Holzgraefe
Edvin Pehlivanovic wrote:
> Sorry, dass es missverständlich war, aber id=3D0 fehlt nicht, da bei =
id=3D0
> die größte vid=3D3 ist, allerdings dort d=3Dy ist.
>
> Ich braucht _nicht_ die Datensätze mit der größten vid (pro id) w=
o d=3Dn,
> sondern nur die Datensätze mit vid ist maximal _und_ d=3Dn. Also wenn=
> vid maximal ist aber d=3Dy, dann soll der DS nicht in der Ergebnismenge=
> sein.
ok, dann
SELECT *
FROM t
WHERE (vid,id) IN (SELECT MAX(vid) AS vid
, id
FROM t
GROUP BY id)
AND d=3D'n';
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 20:05:23 von Stefan Rybacki
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hartmut Holzgraefe wrote:
> Edvin Pehlivanovic wrote:
>...
>> Vielleicht auch für MySQL < 4.1, also ohne Subqueries mit ALL oder ANY.
>
> Das geht dann nur in mehreren Schritten:
>
> CREATE TEMPORARY TABLE tmp1
> SELECT MAX(vid) AS vid
> , id
> FROM t
> WHERE d='n'
> GROUP BY id;
>
> SELECT t.* FROM t JOIN tmp1 USING (vid,id);
>
> DROP TABLE tmp1;
Und hier eine Lösung für MySQL < 4.1 in einem Schritt.
SELECT e1.*
FROM `edvin` e1 LEFT JOIN `edvin` e2 ON (e1.id=e2.id AND e1.vid
e2.vid IS NULL AND e1.d='n'
Bis denn dann
Stefan
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1rc2 (MingW32)
iD8DBQFDyUtzyeCLzp/JKjARAl8ZAJ41u2j8P5E/mlHa2i8sLmkd9Bg8LACd Ezqb
vYFthgYnR6auJZMlDyU7YlE=
=4MsJ
-----END PGP SIGNATURE-----
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 21:45:40 von Hans-Peter Sauer
Hartmut Holzgraefe wrote:
> ok, dann
>=20
> SELECT *
> FROM t
> WHERE (vid,id) IN (SELECT MAX(vid) AS vid
> , id
> FROM t
> GROUP BY id)
> AND d=3D'n';
Vielen Dank. Nach meiner Antwort vorhin, habe ich mir schon so
etwas gedacht. :)
Grüße,
Edvin Pehlivanovic
Re: Hilfe bei komplizierten Unterabfragen
am 14.01.2006 21:47:51 von Hans-Peter Sauer
Stefan Rybacki wrote:
> Und hier eine Lösung für MySQL < 4.1 in einem Schritt.
>=20
> SELECT e1.*
> FROM `edvin` e1 LEFT JOIN `edvin` e2 ON (e1.id=3De2.id AND e1.vid
d) WHERE
> e2.vid IS NULL AND e1.d=3D'n'
Danke. Auch wenn ich noch nicht ganz dahinter gestiegen bin.
Kommt Zeit, kommt Rat. :)
Grüße,
Edvin Pehlivanovic