Requete SQL trop hard pour moi ! - PHP - Programmation
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);
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 : |
exists ? je connais pas ce parametre, interressant ...
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)
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.
Marsh Posté le 19-08-2003 à 21:32:24
MagicBuzz a écrit : à priori, oui. |
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.
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 !
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 !
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 ?
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 ?
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...
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
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
Marsh Posté le 19-08-2003 à 22:46:18
ha ben ouais, forcément, si il exécute pas la requête, c'est pas près de marcher
Marsh Posté le 20-08-2003 à 10:27:19
Code :
|
qq peut me dire pk ce script ne renvoie pas d'erreur ?
La faute de frappe sur le update est volontaire.
Marsh Posté le 20-08-2003 à 10:35:36
zekill a écrit : [MySQL] |
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))..
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à !
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?
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
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