Ji

Ik wil een record invoegen met voorwaarden vanuit meerdere tabellen

Onderstaande code werkt voor een select maar hoe kan ik dit voor een insert

INSERT into vr(id_toernooi, ronde, rondenr, speler1, speler2) values
(75,
 1,
 181,
 924,
 925
)
from 
	TRN__volgenderonde vr
JOIN
	trn__volgenderondeinfo vri
    on vri.id=vr.ronde
where
	(
        ronde=181 AND
        max_games_same_player> (
        SELECT
        	count(id)
        from
        	trn__volgenderonde v2
        WHERE
        	v2.id_toernooi=vr.id_toernooi AND
        	vr.speler1 in (v2.speler1, v2.speler2) AND
        	v2.ronde=vr.ronde AND
        	true
    ) AND
        max_games_same_player> (
        SELECT
        	count(id)
        from
        	trn__volgenderonde v2
        WHERE
        	v2.id_toernooi=vr.id_toernooi AND
        	vr.speler2 in (v2.speler1, v2.speler2) AND
        	v2.ronde=vr.ronde AND
        	true
    ) AND
        (
            speler1=924 OR
            speler2=924 OR
            speler1=925 OR
            speler2=925 OR 
            false
        )
    ) 


Bedoeling is om toernooi, ronde, rondenr en 2 spelers in te brengen indien het maximum (max_games_same_player uit een andere tabel) niet overschreden wordt.

Anders moet ik eerst php laten controleren of het max niet overschreden wordt.

Jan
Wat je wilt heet een "conditional insert" en kan via de constructie INSERT INTO .. SELECT .. WHERE.

Het eerste deel van de qeury wordt dan:

INSERT INTO vr(id_toernooi, ronde, rondenr, speler1, speler2)
SELECT 75, 1, 181, 924, 925

Voor een SELECT heb je niet per se FROM nodig. Na een WHERE statement volgt een expressie waar eventueel ook weer sub-SELECTs in opgenomen kunnen worden. Evalueert het als TRUE, dan wordt de SELECT uitgevoerd en kan INSERT INTO zijn werk doen. Evalueert de WHERE-expressie naar FALSE, dan heeft INSERT INTO niets te doen.

Het wordt me uit je query niet helemaal duidelijk wat er na de WHERE moet volgen.
In ieder geval wel:

WHERE (speler1 IN (924, 925) OR speler2 IN (924, 925))

De logica van de andere subqueries volg ik even niet omdat ik niet precies weet waar de tabellen en kolommen voor zijn. Wat ik wel weet is dat AND TRUE altijd waar is en dus kan worden weggelaten.
En ik kan je aanraden om prepared statements te gaan gebruiken, dan kunnen de literals (waarden) vervangen worden voor placeholders als $1, $2, etc.
Bedankt.
met een paar probleempjes toch gelukt :)

Reageren