Mulla on kolme tietokantataulua(pelkistettynä):
aikaRyhmä:
*id
*...
kokousAjat:
*id
*aikaRyhmäID
*...
Varaukset:
*id
*kokousAjatID
*...
Onko näistä mahdollista rakentaan sellaista DELETE-kyselyä, joka poistaisi kaikki rivit taulusta kokousAjat, jotka sisältävät aikaRyhmäID:n x, mutta joita ei ole varattu(ei löydy taulusta varaukset)?
Itselle tulee lähinnä mieleen purkkaviritelmä, jossa haettaisiin ensi kaikki aikaRyhmään x kuuluvat kokousAjat-taulun rivit taulukkoon, sitten käydään läpi vastaavuudet taulukon ja Varaukset-taulun rivien kanssa, ja poistetaan ne rivit taulukosta, jotka löytyivät Varaukset-taulusta. Lopuksi sitte poistetaan ne rivit kokousAjat-taulusta, joita taulukossa on jäljellä. Tuntuu vaan aika hirveeltä purkalta.
DELETE kokousajat FROM kokousajat LEFT JOIN varaukset ON kokousajat.id = varaukset.kokousAjatID WHERE varaukset.kokousAjatID IS NULL AND kokousajat.aikaRyhmaID = 4
Lisäys: Tuossa siis 4
on se "aikaRyhmäID x".
dartvaneri kirjoitti:
Onko näistä mahdollista rakentaan sellaista DELETE-kyselyä, joka poistaisi kaikki rivit taulusta kokousAjat, jotka sisältävät aikaRyhmäID:n x, mutta joita ei ole varattu(ei löydy taulusta varaukset)?
vesikuusi kirjoitti:
WHERE varaukset.kokousAjatID IS NULL
Eipä taida toimia oikein. Mikäli käsitin oikein, tuossa kyselyssä oletata, että mulla olisi Varaukset-taulussa kaikki samat rivit, kuin kokousAjat-taulussa, mikä ei pidä paikkansa. Varaukset-taulussa on vain niihin kokosAjata-taulun rivehin viittaavat rivit, jotka ovat varattu.
dartvaneri kirjoitti:
Varaukset-taulussa on vain niihin kokosAjata-taulun rivehin viittaavat rivit, jotka ovat varattu.
Kyllä minä sen tajusin.
dartvaneri kirjoitti:
Mikäli käsitin oikein, tuossa kyselyssä oletata, että mulla olisi Varaukset-taulussa kaikki samat rivit, kuin kokousAjat-taulussa --
Et varmaankaan käsittänyt oikein, kun en ymmärrä, mitä höpiset. Testasin kyselyni kannalla, jonka rakenne on seuraava (olin laiska ja tein ja exporttasin sen phpmyadminilla, eli tuossa on kaikenlaista roskaa seassa, mutta olennainen näkyy hyvin)
-- -- Rakenne taululle `aikaryhma` -- CREATE TABLE IF NOT EXISTS `aikaryhma` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; -- -------------------------------------------------------- -- -- Rakenne taululle `kokousajat` -- CREATE TABLE IF NOT EXISTS `kokousajat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `aikaRyhmaID` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `aikaRyhmaID` (`aikaRyhmaID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; -- -------------------------------------------------------- -- -- Rakenne taululle `varaukset` -- CREATE TABLE IF NOT EXISTS `varaukset` ( `id` int(11) NOT NULL AUTO_INCREMENT, `kokousAjatID` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `kokousAjatID` (`kokousAjatID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- -- Rajoitteet vedostauluille -- -- -- Rajoitteet taululle `kokousajat` -- ALTER TABLE `kokousajat` ADD CONSTRAINT `kokousajat_ibfk_1` FOREIGN KEY (`aikaRyhmaID`) REFERENCES `aikaryhma` (`id`); -- -- Rajoitteet taululle `varaukset` -- ALTER TABLE `varaukset` ADD CONSTRAINT `varaukset_ibfk_1` FOREIGN KEY (`kokousAjatID`) REFERENCES `kokousajat` (`id`);
Lisäys:
Selvennykseksi vielä: toimittamani kysely toimii täsmälleen kuten halusit.
dartvaneri kirjoitti:
dartvaneri kirjoitti:
Onko näistä mahdollista rakentaan sellaista DELETE-kyselyä, joka poistaisi kaikki rivit taulusta kokousAjat, jotka sisältävät aikaRyhmäID:n x, mutta joita ei ole varattu(ei löydy taulusta varaukset)?
vesikuusi kirjoitti:
WHERE varaukset.kokousAjatID IS NULL
Tuo WHERE-lause toteuttaa juuri sen "mutta joita ei ole varattu(ei löydy taulusta varaukset)" -toiminnallisuuden.
Äsh..
Anteeksi, mun moka..
Kiitos tästä! :)
Jees.
Aihe on jo aika vanha, joten et voi enää vastata siihen.