Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2062 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Requete SQL trop hard pour moi !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requete SQL trop hard pour moi !

n°491662
zekill
Posté le 19-08-2003 à 20:32:57  profilanswer
 

[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  

mood
Publicité
Posté le 19-08-2003 à 20:32:57  profilanswer
 

n°491683
polo021
Posté le 19-08-2003 à 20:47:00  profilanswer
 

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);  :??:

n°491691
zekill
Posté le 19-08-2003 à 20:50:39  profilanswer
 

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
n°491710
MagicBuzz
Posté le 19-08-2003 à 21:04:23  profilanswer
 

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

n°491723
zekill
Posté le 19-08-2003 à 21:14:46  profilanswer
 

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

n°491726
MagicBuzz
Posté le 19-08-2003 à 21:18:03  profilanswer
 

à 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.

n°491746
zekill
Posté le 19-08-2003 à 21:32:24  profilanswer
 

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.

n°491781
MagicBuzz
Posté le 19-08-2003 à 21:46:10  profilanswer
 

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 !

n°491797
zekill
Posté le 19-08-2003 à 22:03:12  profilanswer
 

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 !

n°491808
MagicBuzz
Posté le 19-08-2003 à 22:13:01  profilanswer
 

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 ?

mood
Publicité
Posté le 19-08-2003 à 22:13:01  profilanswer
 

n°491811
MagicBuzz
Posté le 19-08-2003 à 22:13:38  profilanswer
 

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

n°491832
zekill
Posté le 19-08-2003 à 22:24:10  profilanswer
 

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

n°491839
MagicBuzz
Posté le 19-08-2003 à 22:30:19  profilanswer
 

ç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
n°491853
zekill
Posté le 19-08-2003 à 22:40:49  profilanswer
 

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

n°491857
zekill
Posté le 19-08-2003 à 22:44:54  profilanswer
 

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

n°491859
MagicBuzz
Posté le 19-08-2003 à 22:46:18  profilanswer
 

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

n°492159
zekill
Posté le 20-08-2003 à 10:27:19  profilanswer
 

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.

n°492169
Tsu
Cours Forrest!
Posté le 20-08-2003 à 10:35:36  profilanswer
 

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
n°492185
zekill
Posté le 20-08-2003 à 10:45:55  profilanswer
 

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à !

n°492204
drasche
Posté le 20-08-2003 à 11:06:12  profilanswer
 

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

n°492233
zekill
Posté le 20-08-2003 à 11:33:06  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Requete SQL trop hard pour moi !

 

Sujets relatifs
[MySQL] type char et norme SQL[SQL] insertion pb de clé (DTS SQL SERVER)
[SQL]jointure entre 3 tables[PHP/SQL] Récupérer une valeur
[Access/SQL] Quick Question sur les indexesrequete sql
[ASP/SQL] problème insert into......[SQL] visualiser un fichier .sql
convertir un datetime en date avec SQL serverlister les bases et les tables sur SQL serveur via PHP
Plus de sujets relatifs à : Requete SQL trop hard pour moi !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR