Toon posts:

[mySQL] DELETE van rows uit meerdere tabellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een rij verwijderen uit meerdere tabellen.
In de ene tabel staan prijzen, met als ID: productID
De andere tabel bevat producten, ook met een productID, en een catagorieID.

Nu wil ik een product uit deze 2 tabellen verwijderen, uitgaande van een catagorieID.

Zeg maar, ik zou alle producten uit de catagorie: fietsen willen verwijderen.

PHP:
1
2
3
4
$q="DELETE FROM shop_customPrice
LEFT JOIN shop_customArtikels
ON shop_customPrice.productID = shop_customArtikels.productID
WHERE shop_customArtikels.catID='$_GET[ID]' ";


maar ik krijg de volgende error:
code:
1
You have an error in your SQL syntax near ' shop_customArtikels WHERE shop_customPrice.productID = shop_customArtikels.prod' at line 1


De oorzaak van deze error kan ik echter niet vinden, kan iemand me hierbij helpen?

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

edit:

/me liep, na het lezen van de post van MrX, wat onzin uit te kramen en het begint daarom de hoogste tijd te worden om naar bed te gaan... :P

[edit2]
Heb je al gekeken op Google?
Onder andere deze link kwam ik tegen:
http://builder.com.com/ar...?id=u00320021014dol01.htm

Over de joins:
The mythic DELETE with JOIN
An alternate approach to this problem that a member specifically asked about was the use of JOIN clauses with DELETE statements. Not having used that solution before, I looked into it and found SQL Server documentation claiming this was supported, although not SQL92-compliant. Upon testing and consultation with gurus from various database platforms, I found that the use of DELETE with JOIN statements doesn't work on any of the platforms tested.
Omdat die toch schijnbaar klopte, hier het verhaaltje nogmaals? 8)7

[ Voor 177% gewijzigd door gorgi_19 op 09-12-2002 23:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

MySQL vanaf versie 4.0 ondersteunt wel een multi-tabel delete, zie http://www.mysql.com/doc/en/DELETE.html voor syntex en notes.

Edit:
Overigens vind ik het erg merkwaardig dat je dit niet zelf op kon lossen door gewoon de manual erop na te slaan, en de syntax te volgen. Zou jij dat kunnen uitleggen?

[ Voor 41% gewijzigd door Verwijderd op 09-12-2002 23:37 ]


Verwijderd

Topicstarter
De manual:
http://www.mysql.com/doc/en/DELETE.html

Gaf voor mij onvoldoende informatie om hier uit te komen, de link van gorgi_19 geeft een goed voorbeeld waar ik nu mee ga werken. Lees de link en zeg of jij het antwoord hierin kan vinden.

Verwijderd

Topicstarter
skip

[ Voor 95% gewijzigd door Verwijderd op 09-12-2002 23:51 ]


Verwijderd

Dit lees ik eruit:
1) Er wordt nergens JOIN genoemd, dus die syntax wordt niet ondersteunt. Op dit punt wist ik dus al waarom jouw query niet werkt.

2) In de syntax beschrijving staat o.a.:
SQL:
1
2
3
DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [,table_name[.*] ...]
       FROM table-references
       [WHERE where_definition]

Kortom, een delete op meerdere kolommen tabellen te doen bestaat, en dat gebruik je door de verschillende kolommen tabelnamen te scheiden met komma's

3) Dan lees ik het volgende:
ORDER BY and using multiple tables in the DELETE statement is supported in MySQL 4.0.
Kortom, als ik niet MySQL 4.0 heb, stop ik hier met een poging het werkend te krijgen met 1 DELETE statement en zal ik het met 2 statements gaan oplossen.

4) Als ik wel MySQL 4.0 heb, zou ik het volgende proberen:
SQL:
1
2
3
DELETE FROM shop_customPrice, shop_customArtikels 
WHERE shop_customPrice.productID = shop_customArtikels.productID 
AND shop_customArtikels.catID='$_GET[ID]'


Mijn vraag aan jou: wat hieraan had je niet zelf kunnen bedenken?

edit:

Oeps ... 2 woordjes verkeerd typen en sommige mensen beginnen direct aan je kennis te twijfelen ;)
/me is ontmaskerd al een dyslecticus, die weleens wat met woorden stuntelt :+

[ Voor 11% gewijzigd door Verwijderd op 10-12-2002 16:47 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 09 december 2002 @ 23:46:
De manual:
http://www.mysql.com/doc/en/DELETE.html

Gaf voor mij onvoldoende informatie om hier uit te komen, de link van gorgi_19 geeft een goed voorbeeld waar ik nu mee ga werken. Lees de link en zeg of jij het antwoord hierin kan vinden.
Aangezien * gorgi_19 er nu helemaal niets meer van snapt (MrX legt het weer eens duidelijk uit.. :) )..
Zou je je goede query kunnen posten hoe je het nu hebt opgelost?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
IK heb dat bovenstaande begrepen, maar alleen gemist dat het er vanaf mysql4 inzit.
Die query heb ik dus op een oudere mysql versie losgelaten.

Ik heb nu iets van:
PHP:
1
2
        $q="DELETE FROM shop_customPrice WHERE productID IN
        (\"SELECT productID FROM shop_customArtikels WHERE shop_customArtikels.catID = '$_GET[ID]' \")";


maar het loopt nog niet helemaal lekker.

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

Annie

amateur megalomaan

Verwijderd schreef op 10 december 2002 @ 00:01:
maar het loopt nog niet helemaal lekker.
En dat komt omdat "oude" versies van mysql geen subqueries ondersteunen

[ Voor 4% gewijzigd door Annie op 10-12-2002 00:04 ]

Today's subliminal thought is:


Verwijderd

Topicstarter
Nu heb ik dus al 2 methoden die niet werken, de nu meest eenvoudige oplossing lijkt me het ophalen van de productID's uit de catagorie fiets, en die uit de prijzen tabel wissen. 2 losse query's dus.

Kunnen jullie het hier mee eens zijn?

Verwijderd

En als een subquery het niet doet, zal de multi-table DELETE het helaas ook niet doen (MySQL version < 4.0).

Roger, 10-4 on the 2 queries! (ja dus ;))

[ Voor 19% gewijzigd door Verwijderd op 10-12-2002 00:07 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 10 December 2002 @ 00:06:
Nu heb ik dus al 2 methoden die niet werken, de nu meest eenvoudige oplossing lijkt me het ophalen van de productID's uit de catagorie fiets, en die uit de prijzen tabel wissen. 2 losse query's dus.

Kunnen jullie het hier mee eens zijn?
* gorgi_19 stemt voor.. :P
edit:
Of MrX eens niet zo snel wil zijn.. :P

[ Voor 11% gewijzigd door gorgi_19 op 10-12-2002 00:08 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Dan gaan we dat zo doen. DANK...

Is mysql 4 al een standaard? of nog niet.
Anders kan ik aan mijn provider vragen voor een upgrade.

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

Annie

amateur megalomaan

Verwijderd schreef op 10 december 2002 @ 00:13:
Is mysql 4 al een standaard? of nog niet.
Anders kan ik aan mijn provider vragen voor een upgrade.
Nog steeds beta, afaik.

Today's subliminal thought is:


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Verwijderd schreef op 09 december 2002 @ 23:58:
Dit lees ik eruit:
[...]
2) In de syntax beschrijving staat o.a.:
SQL:
1
2
3
DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [,table_name[.*] ...]
       FROM table-references
       [WHERE where_definition]

Kortom, een delete op meerdere kolommen te doen bestaat, en dat gebruik je door de verschillende kolommen te scheiden met komma's

[...]
Helaas moet ik MrX toch ontmaskeren.
Wellicht dat enige SQL kennis aanwezig is, maar het deleten van een kolom is niet mogelijk.
We spreken of over
1. het deleten van een record (Met een "delete from" statement)
2. het droppen van een kolom (Met een "alter table" statement)
3. het wissen van een veld (Met een "update" statement)

Je kunt volgens de syntax dus zeggen:
DELETE FROM Person WHERE ....
of
DELETE FROM Person.* WHERE ....

Maar dus niet:
DELETE FROM Person.name WHERE ...

[ Voor 11% gewijzigd door Goodielover op 10-12-2002 10:29 . Reden: typo ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Goodielover schreef op 10 December 2002 @ 10:25:
Helaas moet ik MrX toch ontmaskeren.
Wellicht dat enige SQL kennis aanwezig is, maar het deleten van een kolom is niet mogelijk.
We spreken of over
1. het deleten van een record (Met een "delete from" statement)
2. het droppen van een kolom (Met een "alter table" statement)
3. het wissen van een veld (Met een "update" statement)

Je kunt volgens de syntax dus zeggen:
DELETE FROM Person WHERE ....
of
DELETE FROM Person.* WHERE ....

Maar dus niet:
DELETE FROM Person.name WHERE ...

Laten we er dan van uit gaan dat ie meerdere tabellen bedoelde en dat ie dus meerdere tabellennamen bedoelde ;)
Verwijderd schreef op 10 December 2002 @ 00:06:
Nu heb ik dus al 2 methoden die niet werken, de nu meest eenvoudige oplossing lijkt me het ophalen van de productID's uit de catagorie fiets, en die uit de prijzen tabel wissen. 2 losse query's dus.

Kunnen jullie het hier mee eens zijn?
Ik zie iig geen andere oplossing, als je InnoDB-tabellen gebruikt zou ik voor de eerste delete statement BEGIN en na de laatste iig COMMIT neerzetten (en checken of de deletes wel goed ging, anders ROLLBACK roepen tussendoor) oftewel de boel in een transaction verpakken.
Pagina: 1