Suche SQL-Query

knanders

Benutzer
Beiträge
5
Hallo zusammen,

manchmal hat man einen Knoten im Kopf und sieht den Wald voller Bäume nicht:

Ich habe folgendes TabellenBeispiel:

Id​
Funk​
1 1
1 3
1 7
1 9
2 1
2 2
2 3
3 1
3 2
3 4
3 7

Aus dieser Tabelle suche ich jetzt die Id, die folgende Funktionswerte mindestens hat: 1,2,7 also in diesem Fall die Id 3. Hat jemand spontan eine Idee?

Knut
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo zusammen,

manchmal hat man einen Knoten im Kopf und sieht den Wald voller Bäume nicht:

Ich habe folgendes TabellenBeispiel:

Id Funk
1 1
1 3
1 7
1 9
2 1
2 2
2 3
3 1
3 2
3 4
3 7

Aus dieser Tabelle suche ich jetzt die Id, die folgende Funktionswerte mindestens hat: 1,2,7 also in diesem Fall die Id 3. Hat jemand spontan eine Idee?

Knut

Code:
test=*# select * from knanders ;
 id | val
----+-----
  1 |   1
  1 |   3
  1 |   7
  1 |   9
  2 |   1
  2 |   2
  2 |   3
  3 |   1
  3 |   2
  3 |   4
  3 |   7
(11 rows)

Time: 0,177 ms
test=*# select id, array_agg(val) from knanders group by id having array_agg(val) @> array[1,2,7];
 id | array_agg
----+-----------
  3 | {1,2,4,7}
(1 row)

Das ist aber PostgreSQL. Der @> - Operator schaut, ob das eine Array Bestandteil des anderen ist.

Es gibt noch mehr Wege, aber dieser ist übersichtlich und flexibel.
 

akretschmer

Datenbank-Guru
Beiträge
9.423
... danke für die schnelle Antwort. Ich bräuchte aber die Lösung in MySQL ...

Tatsächlich? ;-)

Code:
test=*# select id from (select * from knanders where val in (1,2,7)) bla group by id having count(id) >= 3;
id
----
  3

bzw.

Code:
test=*# select id from (select distinct * from knanders where val in (1,2,7)) bla group by id having count(id) >= 3;
 id
----
  3
(1 row)

Andreas
 

ukulele

Datenbank-Guru
Beiträge
4.582
Code:
SELECT    t0.id
FROM    tabelle t0
WHERE    EXISTS (    SELECT    1
                    FROM    tabelle t1
                    WHERE    t1.Funktionswert = 1
                    AND        t1.id = t0.id )
AND        EXISTS (    SELECT    1
                    FROM    tabelle t2
                    WHERE    t2.Funktionswert = 1
                    AND        t2.id = t0.id )
AND        EXISTS (    SELECT    1
                    FROM    tabelle t3
                    WHERE    t3.Funktionswert = 1
                    AND        t3.id = t0.id )

Das geht vermutlich noch eleganter. Ich könnte jetzt auch einfach die Tabelle 3 mal Joinen:
Code:
SELECT    t1.id
FROM    tabelle t1,
        tabelle t2,
        tabelle t3
WHERE    t1.id = t2.id
AND        t1.id = t3.id
AND        t1.Funktionswert = 1
AND        t2.Funktionswert = 2
AND        t3.Funktionswert = 7
 
Werbung:
Oben