SQL via PHP

SQL via PHP - PHP - Programmation

Marsh Posté le 04-06-2004 à 12:19:13    

Je suis désespéré, je n'arrive pas à exécuter une requête pourtant assez simple.  
Voici mes 2 tables :
--------------           -------------
 annonce                    tab2
   >.num                     >.num
                             >.num_tab2
 
.num est la clef primaire de annonce, .num et .num_tab2 est la clef primaire de tab2.
tab2.num est la clef externe de annonce.
 
Je souhaiterais supprimer les valeurs de tab2 qui n'ont pas de correspondance dans les annonces, soit tab2.num NOT IN annonce.num  
J'ai essayé de plusieurs façons :
1)
mysql_query("DELETE tab2.* FROM annonce,tab2 WHERE annonce.num<>tab2.num" );
->ça fait rien
 
2)
mysql_query("DELETE tab2.* FROM annonce,tab2 WHERE NOT
tab2.num  IN (annonce.num)" );
->ça fait rien
3)
avec  SELECT imbriqué, c'est pas mieux ça produit un erreur de syntaxe:
mysql_query("DELETE tab2.* FROM tab2 WHERE tab2.num NOT IN SELECT ( annonce.num FROM annonce)" );
 
Serait-ce un problème de NOT?
Comment faire?


Message édité par kronab le 04-06-2004 à 12:22:15

---------------
Site de covoiturage gratuit
Reply

Marsh Posté le 04-06-2004 à 12:19:13   

Reply

Marsh Posté le 04-06-2004 à 12:35:33    

si je ne dis pas de betise MySQL ne gere pas les requetes imbriquées (ou alors que récemment)
et NOT meme chose

Reply

Marsh Posté le 04-06-2004 à 12:39:36    

+1 (pour le vieilles versions de mySql)
 
mais on est pas sûr qu'il utilise mySql (même si y a 99% de chances pour que ce soit le cas :D )
 
la principale erreur, ce serait pas le fait d'écrire :
'DELETE tab2.* FROM ...'
au lieu de :
'DELETE FROM ...' ? :)


Message édité par Beegee le 04-06-2004 à 12:39:58
Reply

Marsh Posté le 04-06-2004 à 12:48:34    

Ok merci, vos réponses me sont bien utiles.  
La solution : passer par une table temporaire?


---------------
Site de covoiturage gratuit
Reply

Marsh Posté le 04-06-2004 à 13:31:39    

ou deux requêtes imbriquées

Reply

Marsh Posté le 04-06-2004 à 17:37:31    

misterpinguin a écrit a écrit :

 MySQL ne gere pas les requetes imbriquées




 

urd-sama a écrit :

ou deux requêtes imbriquées


 
 :D


Message édité par titione le 04-06-2004 à 17:38:00
Reply

Marsh Posté le 05-06-2004 à 21:15:15    

deux mysql_query si tu préfère :o
(deux recorset quoi, ché pas comment on dit en php :o)


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 06-06-2004 à 15:13:32    

MySQL4 commence à gerer des requètes imbriquées.

Reply

Marsh Posté le 08-06-2004 à 09:09:02    

Citation :


Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.


Citation :


Before MySQL 4.1, only nested queries of the form INSERT ... SELECT ... and REPLACE ... SELECT ... are supported. The IN() construct can be used in other contexts to test membership in a set of values.


 
http://dev.mysql.com/doc/mysql/en/Subqueries.html
http://dev.mysql.com/doc/mysql/en/ [...] eries.html

Reply

Marsh Posté le 08-06-2004 à 09:29:39    

ouais mais hélàs tous les hébergeurs (mêmes pro) ne sont pas passés en mysql4.1 ;((

Reply

Marsh Posté le 08-06-2004 à 09:29:39   

Reply

Marsh Posté le 08-06-2004 à 09:33:44    

Citation :

Je souhaiterais supprimer les valeurs de tab2 qui n'ont pas de correspondance dans les annonces, soit tab2.num NOT IN annonce.num  
J'ai essayé de plusieurs façons :


 
Autre manière de voir la chose SANS requête imbriquée, suivez le guide :
 
Sélection de tous les enreg de tab2 avec quand c'est possible les annonces correspondantes :

Code :
  1. SELECT
  2.     *
  3. FROM
  4.     tab2 LEFT JOIN annonce
  5. ON
  6.     tab2.num = annonce.num


 
Dans le résultat, annonce.num sera null pour les enregistrement sans correspndance.
 
Donc, si on ne veut que ceux là :

Code :
  1. SELECT
  2.     *
  3. FROM
  4.     tab2 LEFT JOIN annonce
  5. ON
  6.     tab2.num = annonce.num
  7. WHERE
  8.     annonce.num IS NULL


Et le tour est joué.
 
Reste plus qu'à écrire le DELETE :
 

Code :
  1. DELETE
  2.     tab2
  3. FROM
  4.     tab2 LEFT JOIN annonce
  5. ON
  6.     tab2.num = annonce.num
  7. WHERE
  8.     annonce.num IS NULL


 
Testé & approuvé par Mara's dad avec Mysql 4.0.14


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-06-2004 à 09:38:58    

Regardez les exemples à la fin :
http://dev.mysql.com/doc/mysql/en/DELETE.html
Y'en a pas avec LEFT JOIN, seulement des liaisons normales, mais dans le texte, il est bien dit que ça marche avec LEFT JOIN :
 

Citation :

DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id;
 
Or:
 
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id;
 
These statements use all three files when searching for rows to delete, but delete matching rows only from tables t1 and t2.
 
The examples show inner joins using the comma operator, but multiple-table DELETE statements can use any type of join allowed in SELECT statements, such as LEFT JOIN.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 10-06-2004 à 09:20:47    

Bon alors, elle vous plait pas ma solution de la mort qui fait tout en une seule requête ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed