Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WD12 - MySQL 4.1.x Requete

29 réponses
Avatar
I.G.LOG
Bonjour,
Je gère des codes remises associés au fichier articles. Pour ça il y a 3
tables

Table ARTICLE, clé primaire IDARTICLE
Table LIEN, colonnes IDARTICLE,IDCODEREM
Table CODEREM, colonnes IDCODEREM,VALEUR,TYPE

Chaque article peut avoir plusieurs codes remise d'achat et 1 ou 0 code
remise de vente. Ce type est caractérisés par la colonne TYPE qui prend la
valeur 1 pour achat et 2 pour vente.
Je cherche à retourner tous les articles qui n'ont pas de code remise de
vente (type 2) !! sans succès...

j'ai essayé avec la requète:

select IDARTICLE,if(isnull(IDCODEREM),-1,0) as IDCODEREM
from ARTICLE
left join LIEN
on LIEN.IDARTICLE = ARTICLE.IDARTICLE
left join CODEREM
on CODEREM.IDCODEREM = LIEN.IDCODEREM
and TYPE = 2
group by IDARTICLE
having IDCODEREM = -1

mais ca me retourne des doublons sur les articles, même ceux qui ont un code
de vente

Merci pour votre aide, je bloque

10 réponses

1 2 3
Avatar
I.G.LOG
"Firetox" a écrit dans le message de news:
4b0bae59$0$8911$
oui
car en fait tu obtiens les articles sans liens article dons sans
codeRemise
mais est cela que tu voulais ?
select IDARTICLE
from ARTICLE
left join LIEN on LIEN.IDARTICLE = ARTICLE.IDARTICLE
left join CODEREM on CODEREM.IDCODEREM = LIEN.IDCODEREM and TYPE = 2
where LIEN.IDARTICLE is null







oui je cherche avant tout à trouver les articles qui n'ont pas de code
remise de vente (type 2) !
mais je ne comprends pas pourquoi ça marche avec lien.idarticle et pas avec
idcoderem
Avatar
Firetox
Bonjour,

donc la requete precedente ne renvoie ce qu'il faut car elle ne renverra pas
les article qui on un codeRem <> 2
avec le IdcodRem is null renvoie donc tout les articles qui ont des lien ou
non mais pas de lien code 2

select IDARTICLE
from ARTICLE
left join LIEN on LIEN.IDARTICLE = ARTICLE.IDARTICLE
left join CODEREM on CODEREM.IDCODEREM = LIEN.IDCODEREM and TYPE = 2
where CODEREM.IDCODEREM is null

va generer une ligne avec le lien qui va avec s'il y a en mais mettra null
dans le cas ou le code remise n'est pas de type 2 dans codeRem ce qui est
vrai aussi pour les lien de type achat tu a le lien mais si tu join sur
codRem avec type = 2 tu obtiens null et donc il te laisse la ligne

pour avoir ce que tu demande il faut bien faire la requete avec les lien
mais il faut egalement dans le where mettre une chose qui permet d'identifer
les codeRem

select IDARTICLE
from ARTICLE
left join LIEN on LIEN.IDARTICLE = ARTICLE.IDARTICLE
left join CODEREM on CODEREM.IDCODEREM = LIEN.IDCODEREM
where
CODEREM.IDCODEREM is null
or CODEREM.TYPE = 2

dans cette requete on va prendre tous les article et leur lien, ton analyse
dit que le type 2 a une seule ligne par article donc en faisant cette
joiture on garde ceux qui n'ont pas de code remise + ceux ui ont des remise
mais de type = 2 et on devrait avoir 1 seule ligne par article

"I.G.LOG" a écrit dans le message de
news:4b0bb3ad$0$973$

"Firetox" a écrit dans le message de news:
4b0bae59$0$8911$
oui
car en fait tu obtiens les articles sans liens article dons sans
codeRemise
mais est cela que tu voulais ?
select IDARTICLE
from ARTICLE
left join LIEN on LIEN.IDARTICLE = ARTICLE.IDARTICLE
left join CODEREM on CODEREM.IDCODEREM = LIEN.IDCODEREM and TYPE = 2
where LIEN.IDARTICLE is null







oui je cherche avant tout à trouver les articles qui n'ont pas de code
remise de vente (type 2) !
mais je ne comprends pas pourquoi ça marche avec lien.idarticle et pas
avec idcoderem



Avatar
I.G.LOG
je vais esssayer de mieux comprendre tout ça.
Une nouvelle fois merci pour ces explications qui me permettent d'avancer.
Sans vouloir abuser, j'ai posté plusieurs messages concernant un problème de
droits sur MySQL 4.1.9 (serveur Linux FC3) sans réponse qui ne règle mon
problème. Peut-être aurais tu une explication. Voici le problème:
J'ai développé en 2 semaines une fonction multi-sociétés. Lors de l'ajout
d'une société, je dois créer une database (une base par société) et faire
certaines recopies d'une base à l'autre.
Sur mon poste de développement (Win XP, MySQL 4.1.22), tout fonctionne bien.
En revanche, chez le client, ça ne passe pas, j'ai une erreur "1044 access
denied from " sur la commande "create database ta_bases".
En fait, sur mon poste je suis en root, alors que les users du client ne le
sont pas. Je suis donc allé sur le serveur MySQL et j'ai tapé
"grant create on *.* to 'tauser'@'%';" puis "flush privileges;"
Mais rien n'y fait, on dirait que les droits de création ne sont pas pris
pour les user 'tauser', toujours impossible de créer la base !
J'ai même sur le serveur linux executé mysql_fix_privilèges... toujours le
même problème.
Dans my.cnf, pas de skip-network et, de toute façon, rien de particulier (5
lignes seulement)
Aurais tu une idée ?
Encore merci
Avatar
Firetox
Bonjour,

probleme epineux

pour voir deja si ton user a des droits sur la base
- mysql.db stocke les droits des utilisateurs sur des bases de données :

alors que
mysql.user stocke les permissions générales des utilisateurs :

attention aussi je sais qu'il y a vait un bug de ce cote la depuis la 4.1.16
ou donner les droits a un utilisateur lui permettait de creer d'autre base
mais du meme nom o a l'erreur 1044 si je me connecte sur sample et que je
cree TOTO mais je peux creer sAMple (sur les case sensitif)

bref

pour les grant tu utilise bien ceci
GRANT ALL PRIVILEGES ON *.* TO IDENTIFIED BY 'password'
FLUSH PRIVILEGES;

donc verifier par un select * from mySQL.db
les droits sur les base de données de ton user

si tu insert des enreg dans la table il faudra faire un FLUSH PRIVILEGES;
apres
Avatar
Firetox
complement

* Les droits de table et colonnes prennent effet à la prochaine requête
du client.
* Les droits de bases prennent effet à la prochaine commande USE
nom_de_base .
* Les droits globaux et les modifications de droits prennent effets lors
de la prochaine connexion.
Avatar
I.G.LOG
Je veux éviter de donner tous les droits aux users 'tauser', donc je ne
voudrais affecter que le droit création database (CREATE)
La seule différence que je vois avec la commande grant "classique", c'est
que les users 'tauser' sont définis sans mot de passe, je n'ai donc pas mis
le paramètre IDENTIFIED BY !
Dans ce cas, est-ce qu'il faudrait écrire :

GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY ''
au lieu de GRANT CREATE ON *.* TO 'tauser'@'%' ?

complement

* Les droits de table et colonnes prennent effet à la prochaine requête
du client.
* Les droits de bases prennent effet à la prochaine commande USE
nom_de_base .
* Les droits globaux et les modifications de droits prennent effets
lors de la prochaine connexion.




Pour créer la base, j'utilise le code suivant, qui crée la database, ferme
la connexion courante et ré-ouvre une nouvelle connexion sur la nouvelle
base. Je pense donc qu'il ne devrait pas y avoir de problème avec le
complement ci-dessus ?!

// Script de création de la base
lCond = ""
SQLExec("show create database " + Projet:CnxNomBase,"ReqB")
SI SQLFetch("ReqB") = 0 ALORS
lCond = Remplace(SQLLitCol("ReqB",2),Projet:CnxNomBase,"ta_bases")
FIN
SQLFerme("ReqB")
SI PAS SQLExec(lCond,"ReqB") ALORS
SQLInfoGene("ReqB") // Erreur 1044, access denied
Erreur(sql.MesErreur)
FIN
SQLFerme("ReqB")
SI PAS
Projet:InitConnexion("Connexion",Projet:CnxServer,Projet:CnxUser,Projet:CnxPwd,"ta_bases",Projet:CnxTypeBase)
ALORS // Nouvelle connexion
Ferme
FIN
...
Avatar
Firetox
GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY 'MonMotdePasse'

par contre peitite info regarde dans mySQL.user ce que tu as pour
l'utilisateur
pour avoir un double de root tu ajoute une ligne dans la table mysql.user
avec que des Y

ensuite il faut jouer avec ca
par defaut je nutilise plus grant mais directement les tables mysql.user et
mysql.db (il faut etre en root pour les voir)

@+


"I.G.LOG" a écrit dans le message de
news:4b0c00e0$0$934$
Je veux éviter de donner tous les droits aux users 'tauser', donc je ne
voudrais affecter que le droit création database (CREATE)
La seule différence que je vois avec la commande grant "classique", c'est
que les users 'tauser' sont définis sans mot de passe, je n'ai donc pas
mis le paramètre IDENTIFIED BY !
Dans ce cas, est-ce qu'il faudrait écrire :

GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY ''
au lieu de GRANT CREATE ON *.* TO 'tauser'@'%' ?

complement

* Les droits de table et colonnes prennent effet à la prochaine
requête du client.
* Les droits de bases prennent effet à la prochaine commande USE
nom_de_base .
* Les droits globaux et les modifications de droits prennent effets
lors de la prochaine connexion.




Pour créer la base, j'utilise le code suivant, qui crée la database, ferme
la connexion courante et ré-ouvre une nouvelle connexion sur la nouvelle
base. Je pense donc qu'il ne devrait pas y avoir de problème avec le
complement ci-dessus ?!

// Script de création de la base
lCond = ""
SQLExec("show create database " + Projet:CnxNomBase,"ReqB")
SI SQLFetch("ReqB") = 0 ALORS
lCond = Remplace(SQLLitCol("ReqB",2),Projet:CnxNomBase,"ta_bases")
FIN
SQLFerme("ReqB")
SI PAS SQLExec(lCond,"ReqB") ALORS
SQLInfoGene("ReqB") // Erreur 1044, access denied
Erreur(sql.MesErreur)
FIN
SQLFerme("ReqB")
SI PAS
Projet:InitConnexion("Connexion",Projet:CnxServer,Projet:CnxUser,Projet:CnxPwd,"ta_bases",Projet:CnxTypeBase)
ALORS // Nouvelle connexion
Ferme
FIN
...



Avatar
I.G.LOG
"Firetox" a écrit dans le message de news:
4b0c024d$0$14576$
GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY 'MonMotdePasse'

par contre peitite info regarde dans mySQL.user ce que tu as pour
l'utilisateur
pour avoir un double de root tu ajoute une ligne dans la table mysql.user
avec que des Y

ensuite il faut jouer avec ca
par defaut je nutilise plus grant mais directement les tables mysql.user
et mysql.db (il faut etre en root pour les voir)

@+





D'accord je vais essayer de voir tout ça.
Merci beaucoup !!!
Phil
Avatar
Firetox
Bonjour,

GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY ''MonMotdePasse''
si tu es connecté a une base portera sur les tables

GRANT CREATE ON * TO 'tauser'@'%' IDENTIFIED BY 'MonMotdePasse'
remarque le * a la place de *.*
dans ce cas si tu n'est pas connecté a une base les droits sont serveur
sinon sur la base courante comme un GRANT ON Mabase.*

bon dev
@+
Avatar
I.G.LOG
"Firetox" a écrit dans le message de news:
4b0c068d$0$9201$
Bonjour,

GRANT CREATE ON *.* TO 'tauser'@'%' IDENTIFIED BY ''MonMotdePasse''
si tu es connecté a une base portera sur les tables

GRANT CREATE ON * TO 'tauser'@'%' IDENTIFIED BY 'MonMotdePasse'
remarque le * a la place de *.*
dans ce cas si tu n'est pas connecté a une base les droits sont serveur
sinon sur la base courante comme un GRANT ON Mabase.*

bon dev
@+





C'est peut-être alors la deuxieme commande qui faut utiliser sur le serveur
mysql !!!
Je vais essayer ça jeudi prochain (je ne suis pas chez le client et sur mon
poste je n'ai pas de problème)
Encore merci
1 2 3