Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL-haku kysymys

Myanda [17.01.2007 17:07:33]

#

Eli, mulla on kolme taulua tiedostosysteemiin. Kategoriat, alakategoriat ja tiedostot. Nyt tuli sitten ongelma poistamisen yhteydessä.

$sql = mysql_query("DELETE FROM file_s WHERE lcid = (WHERE cid = ".$_POST['category'].")") or die ('Ei onnistuttu poistamaan taulusta.');

$sql = mysql_query("DELETE FROM file_l_categories WHERE cid = ".$_POST['category']) or die ('Ei onnistuttu poistamaan taulusta.');

$sql = mysql_query("DELETE FROM file_categories WHERE id = ".$_POST['category']) or die ('Ei onnistuttu poistamaan taulusta.');

Ensimmäisen poiston kohdalla kurahtaa, eli miten tuollaisen saisi toteutettua yhdellä haulla? Vai saako edes?

lcid = alakategorian id
cid = kategorian id
$_POST['category'] = lomakkeen kautta tuleva poistettavan kategorian id

Ymmärsikö kukaan? :D

Agony [17.01.2007 17:19:36]

#

Vaikuttaa hieman PEP:ltä tuo ensimmäinen kysely, mutta jos oikein tulkitsin niin taulussa file_s ei ole cid-kenttää, ainoastaan lcid? jos käytössä on MySQL 5, voit kokeilla jotain seuraavanlaista:

DELETE FROM file_s WHERE lcid ANY (SELECT lcid FROM file_l_categories WHERE cid = '{$_POST['category']}');

jolloin alikysely hakee kaikkien alakategorioiden ID:n jotka liittyvät poistettavaan kategoriaan ja vie ne file_s pääkyselyyn missä minkä tahansa id:n täsmätessä poistetaan tietue... kait (niin pitkä aika kun viimeksi pelaillut alikyselyillä) :)

Myanda [17.01.2007 17:46:50]

#

Noniin, tuolla koodilla saatiin pienellä muokkauksella osaks toimimaan. Eli nyt on

DELETE FROM file_s WHERE lcid = (SELECT id FROM file_l_categories WHERE cid = '".$_POST['category']."')

joka toimii, mikäli alakategorioita on vain yksi. Mitenkäs saisi poistamaan kaiken, vai pitäisköhän käyttää for-lausetta? Jos käytän for-lausetta, niin mites se count funktio toimikaan mysql-haussa?

Myanda [17.01.2007 18:56:07]

#

Asia on nyt kunnossa, vanhalla kunnon for-lauseella.

Agony [17.01.2007 20:06:48]

#

Turha on rääkätä kantaa n kyselyllä kun sen voi tehdä yhdelläkin. Suosittelen manuaalin kohtaa alikyselyistä, sillä homma lähtee pelittämään heti kun löydät taikasanan yhtäläisyysmerkin tilalle lcid oikealla puolella joka on siis ANY, IN, SOME tai ALL tai EXISTS, NOT EXISTS.

Agony [18.01.2007 09:54:59]

#

Nyt kun syvennyin manuaaliin, tulin siihen tulokseen että sen täytyy olla IN, eli kyselyn

DELETE FROM file_s WHERE lcid IN (SELECT id FROM file_l_categories WHERE cid = '".$_POST['category']."')

pitäisi hoitaa homma kotiin yhdellä kyselyllä.

kasetti [18.01.2007 11:15:53]

#

Jos tietokantajärjestelmä vain tukee niin alitauluista poistaminen kannattaa toteuttaa foreign key constrainteilla. Tällöin päätaulusta poistettaessa alitaulun tiedot poistuvat automaattisesti ja tietokanta pysyy eheänä:

http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html

Vastaus

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

Tietoa sivustosta