[SQL] multiple IN multiple
t1. r_d_available( id, name )
t2. r_d_per_planet( r_d_id, planet_id, eta ) [r_d_id is FK voor t1.id]
t3. r_d_requires( r_d_id, r_d_requires_id ) [beide zijn FK's voor t1.id]
De pure-data tabel is dus r_d_available.
In r_d_per_planet staat per gebruiker welke r_d er bezig en klaar zijn en hoelang het nog duurt voordat ie klaar is (`eta`).
In r_d_requires staat welke r_d er nodig is (klaar: `eta` = 0) om deze r_d te starten.
Misschien is het niet helemaal duidelijk:
r_d_available heeft 10 rijen, `id` 1 t/m 10
r_d_per_planet heeft 2 rijen: (1,X,0) en (2,X,2)
r_d_requires heeft twee rijen: (3,1) en (3,2)
Ofwel:
- Voor r-d's 1 en 2 zijn geen 'requirements'.
- r-d 1 is al klaar.
- r-d 2 moet nog 2 ticks en is dan klaar.
- r-d 3 heeft r-d's 1 EN 2 nodig om te mogen starten.
De query moet een resultaat geven, zo dat alle r-d worden weergegeven die 'toegestaan' zijn: aan alle requirements is voldaan. Voor sommige r-d zijn er dat 0, voor de meeste 1 en voor anderen 2 of 3. Elke rij in r_d_available heeft dus 0, 1, 2 of 3 rijen in r_d_requires.
Ik wil een lijst van alle r_d_available waarvan de r_d_id's van de requirements in r_d_requires voorkomen in r_d_per_planet met `eta` = 0 :)
Ik dacht aan een statement met ".. AND (SUBQUERY1) IN (SUBQUERY2) ..", waar SUBQUERY1 = [alle requirements voor deze rij] en SUBQUERY2 = [alle finished (`eta`=0) r_d voor planet X].
Hoe ik het op moet schrijven weet ik niet, en ik weet niet of MySQL multiple IN multiple snapt en ik kan er nergens iets over vinden en niemand weet raad.
Misschien zit ik helemaal op de foute weg, dan moet ik iets anders bedenken, maar weet iemand een oplossing voor het probleem? Hoeft niet perse met (SQ1) IN (SQ2) hoor ;)
Mijn dank is groot
Gewijzigd op 01/01/1970 01:00:00 door Rudie dirkx
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT
*
FROM
r_d_available a
WHERE
T = 'r' AND
(
SELECT
r_d_requires_id
FROM
r_d_requires
WHERE
r_d_id = a.id
) IN (
SELECT
r_d_id
FROM
r_d_per_planet
WHERE
eta = 0 AND
planet_id = $1
)
ORDER BY
id ASC;
$1 = X
*
FROM
r_d_available a
WHERE
T = 'r' AND
(
SELECT
r_d_requires_id
FROM
r_d_requires
WHERE
r_d_id = a.id
) IN (
SELECT
r_d_id
FROM
r_d_per_planet
WHERE
eta = 0 AND
planet_id = $1
)
ORDER BY
id ASC;
$1 = X
Error: Subquery returns more than 1 row
Dus multiple IN multiple zal wel niet werken :(
Gewijzigd op 01/01/1970 01:00:00 door rudie dirkx
als je niet meer dan een waarde wil in je subquery waarom werk je dan niet met limit
Dat is het hele princiepe: 'requirements' (SUBQUERY1) kunnen er meer dan 1 zijn (maar ook 1 of 0) EN 'completed' (SUBQUERY2) kunnen er ook meer dan 1 zijn (maar ook 1 of 0).
Bumpen::
SanThe.
Blanche, je bent helemaal geweldig!! Ten eerste petje af omdat je snapt wat ik bedoel :) En ten tweede omdat je het werkend krijgt.
Ik vond mijn query leuker ;) en het valt me tegen van MySQL dat het niet werkt, maar so be it. Nu werkt het. Heerlijk!
Enorm bedankt!!
Maar goed, veel plezier ermee...