Requete SQL trop hard pour moi !

Requete SQL trop hard pour moi ! - PHP - Programmation

Marsh Posté le 19-08-2003 à 20:32:57    

[MySQL]
Je veux modifier le champs "etat" de la table1 si le champs "ref" des enregistrements de la table1 n'est pas retrouvé dans le champs "ref" des enregistrements de la table2.
 
C'est chaud comme truc non ?
J'y arrive pas  :o  

Reply

Marsh Posté le 19-08-2003 à 20:32:57   

Reply

Marsh Posté le 19-08-2003 à 20:47:00    

je te donne une requete a laquelle je viens de penser, la syntaxe n'est peut etre pas correcte et ca ne marche peut etre pas, juste une idée de depart peut etre :
 
update table1 t1 set etat = 1 where exists(select * from table2 t2 where t2.ref = t1.ref);  :??:

Reply

Marsh Posté le 19-08-2003 à 20:50:39    

polo021 a écrit :

je te donne une requete a laquelle je viens de penser, la syntaxe n'est peut etre pas correcte et ca ne marche peut etre pas, juste une idée de depart peut etre :
 
update table1 t1 set etat = 1 where exists(select * from table2 t2 where t2.ref = t1.ref);  :??:  


exists ? je connais pas ce parametre, interressant ...  :jap:


Message édité par zekill le 19-08-2003 à 20:50:54
Reply

Marsh Posté le 19-08-2003 à 21:04:23    

ouais sauf qu'à priori, c'est "where not exists()"

Reply

Marsh Posté le 19-08-2003 à 21:14:46    

Wé, donc ca donne:
 
UPDATE tbl1 SET etat='0' WHERE NOT EXISTS (SELECT * FROM tbl2 WHERE tbl2.ref = tbl1.ref)

Reply

Marsh Posté le 19-08-2003 à 21:18:03    

à priori, oui.
 
par contre, à la place de *, essaie de mettre "null" (la valeur, pas la chaîne de caractère). si le sgbd supporte (normalement, il doit supporter) ça peut améliorer les performances. c'est une bonne habitude à prendre.

Reply

Marsh Posté le 19-08-2003 à 21:32:24    

MagicBuzz a écrit :

à priori, oui.
 
par contre, à la place de *, essaie de mettre "null" (la valeur, pas la chaîne de caractère). si le sgbd supporte (normalement, il doit supporter) ça peut améliorer les performances. c'est une bonne habitude à prendre.


ok pour "null"
Je viens d'essayer cette requete, ca plante pas mais le champs "etat" est pas modifié, ca me parait pourtant correct comme logique.

Reply

Marsh Posté le 19-08-2003 à 21:46:10    

tu peux essayer ça (mais c'est beaucoup plus lent, donc à éviter si c'est un traîtment régulier sur un gros volume de données)
 
update tbl1 set etat=0 where ref not in (select distinct ref from tbl2)
 
le souci, c'est que le IN est limité en nombre d'occurences à 1000 je crois. donc si tbl2 a plus de 1000 lignes ça va merder.
le distinct n'est là que pour contourner le problème si ref contient un grand volume de doublons. mais ça ralentis encore plus le traîtement !

Reply

Marsh Posté le 19-08-2003 à 22:03:12    

y a en effet 1700 lignes, mais cette requette doit etre executer une fois par semaine donc c pas la mort mais si c'est gourmant en ressource.
Par contre, je viens d'essayer ta requette et ca ne modifie pas non plus le champs "etat", je vais regarder si j'ai pas une merde ailleurs car là , c pas normal.
 
Sinon, il me reste plus qu'a imbriquer des "while" mais j'ai horreur de ça !

Reply

Marsh Posté le 19-08-2003 à 22:13:01    

c'est quoi ton sgbd ?
 
parceque là, normalement les deux syntaxes sont tout à fait justes :??:
 
PS: ce serait pas des types char de taille différente ?

Reply

Marsh Posté le 19-08-2003 à 22:13:01   

Reply

Marsh Posté le 19-08-2003 à 22:13:38    

et sinon, y'a des null dans tes colonnes ref ?

Reply

Marsh Posté le 19-08-2003 à 22:24:10    

si les tailles sont differentes:
varchar 7 et varchar 100
mais ca gene en quoi ça ?

Reply

Marsh Posté le 19-08-2003 à 22:30:19    

ça peut interférer.
 
utilise une fonction trim (ou "ltrim(rtrimstr))" ) en fonction de ton SGBD.
 
mais sinon, je te l'accorde, ça devrait plutôt faire le contraire...
 
c'est quoi ton SGBD ?
 
quandtu teste, c'est depuis la même fenêtre SQL ? ou une autre ? ou un programme ? regarde quand même de ce côté si l'autocomit est désactivé, sinon, tu peux toujours mettre à jour, tu verras jamais de modif depuis une autre session...


Message édité par MagicBuzz le 19-08-2003 à 22:31:44
Reply

Marsh Posté le 19-08-2003 à 22:40:49    

UPDATE produits SET etat = 0 WHERE NOT EXISTS(SELECT * FROM brs WHERE LTRIM( RTRIM(brs.reference) ) = LTRIM( RTRIM(produits.reference) )
 
pareil snif

Reply

Marsh Posté le 19-08-2003 à 22:44:54    

Ptain, suis fatigué là, je fait des erreurs de syntaxes volontaires dans la requette et il plante pas d'erreur comme si il executer pas la requette !!!!
je vais au lit, je regarde demain là ou je merde

Reply

Marsh Posté le 19-08-2003 à 22:46:18    

:lol:
 
ha ben ouais, forcément, si il exécute pas la requête, c'est pas près de marcher :D

Reply

Marsh Posté le 20-08-2003 à 10:27:19    

Code :
  1. <?php
  2. require ("../configuration.inc.php" );
  3. mysql_connect ($serveur_mysql, $utilisateur_mysql, $mot_de_passe_mysql) or die ("Erreur de connection au serveur" );
  4. mysql_select_db ($nom_de_la_base) or die ("Erreur de connection à la base de données" );
  5. mysql_query("UPDATxx produits SET etat = 0 WHERE NOT EXISTS(SELECT * FROM brs WHERE LTRIM( RTRIM(brs.reference) ) = LTRIM( RTRIM(produits.reference) )" );
  6. mysql_close();
  7. ?>


qq peut me dire pk ce script ne renvoie pas d'erreur ?
La faute de frappe sur le update est volontaire.

Reply

Marsh Posté le 20-08-2003 à 10:35:36    

zekill a écrit :

[MySQL]
Je veux modifier le champs "etat" de la table1 si le champs "ref" des enregistrements de la table1 n'est pas retrouvé dans le champs "ref" des enregistrements de la table2.
 
C'est chaud comme truc non ?
J'y arrive pas  :o  


 
Boa, faudrait peut être jeter un oeil aux jointures gauches et droites non?
sinon tu le fais avec une requete imbriquée (NOT IN (SELECT ref FROM table2))..


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 10:45:55    

Wé mais le prob là, c que je peut inscrire ce que je veux dans la requette, php ne me renvoie pas d'erreur de syntaxe !!!
Mes autres requettes fonctionnent, je sais pas ce qui a là !

Reply

Marsh Posté le 20-08-2003 à 11:06:12    

c'est quelle version de MySQL? :??:
 
tu sais que les requêtes imbriquées ne sont supportées que dans la 4.1? :D

Reply

Marsh Posté le 20-08-2003 à 11:33:06    

ah ben non, c pas la 4.1, c'est celle installée avec easyphp 1.6 donc 3.qqchose

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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