[MySQL] Hoe een join gebruiken tijdens deleten?

Pagina: 1
Acties:

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 18:48
Bij de (verkorte) structuur:

forum(id);
topic(id, forumid);
post(id, topicid);

wil ik een aantal posts wissen:
code:
1
DELETE FROM post WHERE post.topicid = topic.id AND topic.forumid = $forumid
maar MySQL begint dan over "Unknown table 'topic' in where clause".

Wanneer ik dit er van maak:
code:
1
DELETE FROM post, topic WHERE post.topicid = topic.id AND topic.forumid = $forumid
wist die dan niet uit beide post en topic? Dat moet namelijk niet.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

wat je wil kan helemaal niet, tenzij je met sub-queries gaat werken. En die worden weer niet ondersteund in mySQL :(

Today's subliminal thought is:


Verwijderd

toch jammer dat dingen als
FOREIGN KEY(soort_id) REFERENCES SOORT(id)ON DELETE SET NULL ON UPDATE CASCADE);

niet werken in MySQL.
iemand enig idee of ze daaro bij mysql van plan zijn er ooit een echte DBMS van te maken ?

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 18:48
Goed, we lossen het op met wat geneste while-lusjes...

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 23:13
Dit is misschien wel een interressant stukkie voor je:

code:
1
2
3
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
  FROM tab1, tab2
 WHERE tab1.col1 = tab2.col2;

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

maar als ik het allemaal goed begrijp krijg je hier gewoon een x aantal (sql-query)strings terug die je alsnog in een loopje moet uitvoeren.
En da's nou weer zo'n performance-killer.

Dan is het beter (als het mogelijk is) om in een query alle id's op te vragen van de velden die gedelete moeten worden en dan onderstaande constructie (voor de newbies: dit is natuurlijk geen werkende code, maar een voorbeeldje van hoe je het moet opzetten ;)) te gebruiken:

$sql = "delete from tabel where id in (";
while recordset {
$sql .= id . ",";
}
$sql = substr($sql,0,-1) . ")";

en dan deze query uitvoeren.

Today's subliminal thought is:


  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 18:48
ff denken... dan wordt de code in mijn geval:

Wissen van een alle posts binnen een category, wanneer een category wordt gewist.
code:
1
2
SELECT CONCAT('DELETE FROM post WHERE topicid = ', topic.id, ';') FROM forum, topic WHERE forum.category = $categoryid
AND topic.forumid = forum.id;


Wissen van een alle posts binnen een forum, wanneer een forum wordt gewist.
code:
1
SELECT CONCAT('DELETE FROM post WHERE topicid = ', topic.id, ';') FROM topic WHERE topic.forumid = $forumid;


Wissen van een alle posts binnen een topic, wanneer een topic wordt gewist.
code:
1
DELETE FROM post WHERE topicid = $topicid;


Toch? :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

het zal ongetwijfeld kloppen ;)
maar bedenk wel dat zo'n "concat-select-statement" niet de feitelijke delete uitvoert. Je krijgt alleen maar een string terug in de vorm van een delete statement.

Stel: je hebt 100 posts in een forum. Je krijgt dan een recordset van 100 strings, die je dan in een standaard while loopje weer moet voeren aan de mysql_query() functie.

Ik geloof nog steeds dat mijn methode hierboven dan een betere optie is (lees: minder verkeer naar de database, en dus sneller).

Tenzij ik natuurlijk helemaal mis zit. In dat geval zal ik netjes mijn mond houden en me diep gaan schamen omdat ik iets over het hoofd heb gezien.

Today's subliminal thought is:


  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 18:48
Misschien dat ik me zou moeten gaan schamen. ;) Ik kijk nu nog eens goed en zie dat je de IN() functie gebruikt. Ik wist dus niet dat MySQL die al kende (ik nam aan van niet aangezien een sub-query niet werkt).

Ik krijg een idee:
(voor het wissen van alle posts binnen een category)
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT id FROM post WHERE post.topicid = topic.id AND topic.forumid = forum.id AND forum.category = $category;

-----

$sql = "";
while ($res = mysql_fetch_array("query hier")) $sql .= $res['id'] . ", ";
$sql = substr($sql, 0, -1);

-----

DELETE FROM post WHERE id IN($sql);
2 queries :)

Wat denk je er van Annie? :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

paar kleine foutjes (vergissinkjes):
SELECT post.id FROM post,forum WHERE post.topicid = topic.id AND topic.forumid = forum.id AND forum.category = $category;
-----
$sql = "";
while ($res = mysql_fetch_array($queryresultindex)) $sql .= $res['id'] . ", ";
$sql = substr($sql, 0, -1);
-----
DELETE FROM post WHERE id IN($sql);

Today's subliminal thought is:


  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 18:48
Bedankt allen! :)

  • 2
  • Registratie: November 2000
  • Laatst online: 31-03 13:52

2

Deze even omhoog geschopt just for the record. Ik had deze namelijk gevonden en heb vervolgens een half uur lopen klooien en bleef maar errors krijgen. De substr() klopt hier namelijk niet helemaal, hij haalt nu in de string $sql namelijk alleen de whitespace achteraan weg, en niet de komma. Moet dus substr($sql,0,-2) zijn.

Dus aangezien ik dit nogal een nuttig topic vond en dit foutje makkelijk over het hoofd gezien kan worden (en erg frustrerend kan werken ;) ), dacht ik, kom ik zet het erbij.
Pagina: 1