Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PDO: DELETE-kysely

dartvaneri [10.11.2014 14:39:42]

#

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.

vesikuusi [10.11.2014 15:36:35]

#

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 [10.11.2014 16:04:13]

#

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.

vesikuusi [10.11.2014 16:10:56]

#

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.

dartvaneri [10.11.2014 18:03:47]

#

Äsh..
Anteeksi, mun moka..
Kiitos tästä! :)

vesikuusi [10.11.2014 18:06:37]

#

Jees.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta