[problème] requête imbriquée

Totorodu31
Invité n'ayant pas de compte PHPfrance

29 avr. 2005, 15:23

Bonjour
J'utilise dans mon code cette requête imbriquée dans un site mais elle ne fonctionne pas, pouvez vous me dire où se trouve mon erreur ?

Code : Tout sélectionner

DELETE FROM gamme WHERE id_gamme not in ( SELECT id_gamme FROM relation_famille_gamme )

Sinon je me posais la question s'il était possible de mettre plusieurs requêtes à la suite comme ci-dessous (je me suis inspiré du langage sql de base) :

Code : Tout sélectionner

$sql = " DELETE FROM famille WHERE id_famille=$id_famille ; DELETE FROM relation_famille_gamme WHERE id_famille=$id_famille ; "; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$requete.'<br>'.mysql_error()); ...
J'ai testé, en vain, y a-t-il une alternative que de faire les requêtes une à la fois ?

Daz
Eléphanteau du PHP | 36 Messages

29 avr. 2005, 15:34

Salut,

La reponse a la deuxieme question est non !

++

Daz

totorodu31
Invité n'ayant pas de compte PHPfrance

29 avr. 2005, 15:36

merci pour l'information

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 avr. 2005, 15:37

Daz, t'abuses !
Tu ne crois pas que tu aurais aussi pu répondre à la première question ? :lol:

Mammouth du PHP | 19672 Messages

29 avr. 2005, 15:41

Pour la première question, vérifie la version de ton serveur MySQL, je ne crois pas que les requêtes imbriquées soient supportées avant la version 4 et encore je ne suis pas certain de mon affaire... :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Daz
Eléphanteau du PHP | 36 Messages

29 avr. 2005, 16:03

Code : Tout sélectionner

DELETE FROM gamme WHERE id_gamme not in ( SELECT id_gamme FROM relation_famille_gamme )
Ta requete est correcte !
(a part le ';' qui manque ) :wink:

Les sous-requetes sont dispos depuis MySQl 4.1

T'inquièt Albat, c 'est juste pour les stats !! :twisted:

++

Daz

guy
Eléphant du PHP | 134 Messages

29 avr. 2005, 22:06

Une jointure n'est pas plus indiquée dans des cas comme cela ?
Guy

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 avr. 2005, 22:10

Si la requête était un SELECT, il faudrait utiliser une jointure sans hésiter,
mais je ne sais pas si l'on peut utiliser une jointure dans un DELETE...

Daz ?... :?:

ViPHP
ViPHP | 1380 Messages

30 avr. 2005, 10:45

Si la requête était un SELECT, il faudrait utiliser une jointure sans hésiter,
mais je ne sais pas si l'on peut utiliser une jointure dans un DELETE...

Daz ?... :?:
C'est possible mais il faut alors utiliser la syntaxe réservée aux "cross-table" DELETE (versions 4.0 et +). Si on utilise la syntaxe "normale":

Code : Tout sélectionner

DELETE FROM t1 LEFT JOIN t2 ON t1.col = t2.col WHERE t2.col IS NULL
MySQL voit le JOIN et se dit: "Ah! il veut un DELETE multi-tables. Mais il ne me dit pas de quelle table je dois supprimer les enregistrements! Voilà encore un programmeur qui pense que je vais tout deviner à sa place etc... (litanie connue des langages martyrisés) Et paf-> que je te balance une erreur!

La bonne manière maintenant.

Code : Tout sélectionner

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.col = t2.col WHERE t2.col IS NULL
Ca semble un peu curieux de répéter deux fois t1, mais c'est uniquement de cette manière que ça marchera.

En passant, le DELETE multi-table est souvent méconnu mais est très pratique pour, par exemple, supprimer des clients ou membres de toutes les tables où ils se trouvent.
Modifié en dernier par Ripat le 30 avr. 2005, 10:49, modifié 1 fois.
ripat

Mammouth du PHP | 19672 Messages

30 avr. 2005, 10:48

:ordi: <== Cyrano prend des notes ;)
Excellent, même si je ne suis pas le destinataire, merci Ripat
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1380 Messages

30 avr. 2005, 12:13

Cyrano: :wink:

On a tous, un jour ou l'autre, souffert de la mise en SQL de requêtes complexes.

Beaucoup de spécialistes de bases de données s'accordent à dire que les jours du ANSI SQL comme langage d'accès à une RDBMS sont comptés. Trop étriqué et que dire des implémentations "propriétaires" des Oracle, MS-SQL, Sybase et autres MySQL.

Mais ça bouge semble t'il :
http://www.techworld.com/applications/f ... tureid=910
http://dbappbuilder.sourceforge.net/Rel ... troduction

Pour la génération de programmeur suivante?

En attendant il faudra faire avec des sous-requêtes et vivre avec la problématique des champs nuls.
ripat

Mammouth du PHP | 19672 Messages

30 avr. 2005, 12:22

Pour la génération de programmeur suivante?
Il y a des chances : le temps que tous les éditeurs de bases de données s'entendent à peu près pour adopter un nouveau système, ça risque de prendre un certain temps, même si ils s'accordent tous à reconnaître que le nouveau système est meilleur et plus simple.

En attendant, on a pas fini de se torturer les méninges pour exploiter correctement l'ASNI-SQL actuel. Ce qui pourrait faire avancer rapidement les choses, ce serait la sortie d'un SGBD avec la nouvelle norme qui prennent une ampleur considérable dans un temps très limité, suffisament vite et fort pour faire réagir les éditeurs majeurs. Mais là encore, j'ai un doute, ces derniers sont certainement déjà en train de préparer la prochaine génération et attendent les premiers coups de feu des adversaires avant de montrer quoi que ce soit.

Je vais jeter un oeil aux articles que tu me suggères, merci pour l'info :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

totorodu31
Invité n'ayant pas de compte PHPfrance

02 mai 2005, 11:43

merci pour les réponses