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