MySQL 4.1 et jointure multiple

Le
I.G.LOG
Bonjour
Je travaille sur une base MySQL 4.1 et je n'arrive toujours pas à gérer ca
cas:
Je veux récupérer les TVA avec leurs comptes débit et crédit. Bien entendu,
je dois lire toutes les TVA même si les comptes ne sont pas renseignés.
J'ai essayé avec la requete suivante, sans succès (erreur 1064)

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA
from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT,
tva as tvabis left join cptplan as cre and cre.IDCPTPLAN =
tvabis.IDCPTCREDIT
where
OBSOLETE = 0
order by
NUMTVA

la table TVA a la structure suivante:

NUMTVA tinyint
IDCPTDEBIT smallinit // Pointeur compte débit
IDCPTCREDIT smallint // Pointeur compte crédit

la table COMPTE :

IDCOMPTE smallinit
NUMCOMPTE varchar(11)

Merci beaucoup
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Firetox
Le #17235301
Bonjour,

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT,
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA

devrait mieu fonctionné
tu part de tva et tu fait 2 jointures sur compte 1 pour deb et l'autre
credit
puisque tva a Les 2 infos et que tu veux toutes les tva c'est la table de
depart

Bon dev
@+

Firetox


"I.G.LOG" 48ce9994$0$869$
Bonjour
Je travaille sur une base MySQL 4.1 et je n'arrive toujours pas à gérer ca
cas:
Je veux récupérer les TVA avec leurs comptes débit et crédit. Bien
entendu, je dois lire toutes les TVA même si les comptes ne sont pas
renseignés.
J'ai essayé avec la requete suivante, sans succès (erreur 1064)

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA
from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT,
tva as tvabis left join cptplan as cre and cre.IDCPTPLAN =
tvabis.IDCPTCREDIT
where
OBSOLETE = 0
order by
NUMTVA

la table TVA a la structure suivante:

NUMTVA tinyint
IDCPTDEBIT smallinit // Pointeur compte débit
IDCPTCREDIT smallint // Pointeur compte crédit

la table COMPTE :

IDCOMPTE smallinit
NUMCOMPTE varchar(11)

Merci beaucoup



I.G.LOG
Le #17235451
"Firetox" 48ce9e5a$0$3881$
Bonjour,

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT,
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA




Ben non, j'ai essayé ca plante à l'exécution avec la même erreur 1064 sur le
2eme left join
Firetox
Le #17235621
oui il y a une virgule en trop

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA

est la bonne requete


"I.G.LOG" 48cea196$0$964$
"Firetox" 48ce9e5a$0$3881$
Bonjour,

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT,
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA




Ben non, j'ai essayé ca plante à l'exécution avec la même erreur 1064 sur
le 2eme left join



I.G.LOG
Le #17235791
"Firetox" 48cea4cb$0$11223$
oui il y a une virgule en trop

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA

est la bonne requete




Ca fonctionne en MySQL 5, malheureusement pas en 4.1. J'ai jonglé avec des
alias et jointures "compliquées" et là ca marche. voici la requete:

SELECT tva.LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as
CPTDEBIT,tva.NUMTVA
FROM
tva left join cptplan as DEB on DEB.IDCPTPLAN = tva.IDCPTDEBIT,
tva as tvabis left join cptplan as CRE on CRE.IDCPTPLAN = tvabis.IDCPTCREDIT
where
tva.numtva = tvabis.numtva
and tva.obsolete = 0

heureusement que j'ai un identifiant unique sur TVA. sinon ca ne serait pas
gérable.
Je crois que la version 5 a revu pas mal de choses au niveau de jointures
multiples, notamment pour régler ce genre de problème (pourtant simple)

Encore un grand merci à toi pour ton aide
Bon dev
Phil
Firetox
Le #17239261
la tu m"etonne mais il y avait une erreur dans la requete
j'utilise ce genre de jointure depuis mySQL 3.26 et cela a toujours
fonctionner jusqu'a la version .5.1
par contre la syntaxe using est un peu perturber en 5 c'est la seule chose
qu'on avait vu et des requetes compliquée on en a des tonnes (j'en ai fait
qui faisait 19 000 ligne !! construite dynamiquement

voici ta requete et elle doit fonctionner

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb ON deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre ON cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA

si ca ne fonctionne pas sous windev essaye quand meme avec un frontal comme
SQLyog



"I.G.LOG" 48cea7a6$0$908$

"Firetox" 48cea4cb$0$11223$
oui il y a une virgule en trop

select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb on deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre and cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA

est la bonne requete




Ca fonctionne en MySQL 5, malheureusement pas en 4.1. J'ai jonglé avec des
alias et jointures "compliquées" et là ca marche. voici la requete:

SELECT tva.LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as
CPTDEBIT,tva.NUMTVA
FROM
tva left join cptplan as DEB on DEB.IDCPTPLAN = tva.IDCPTDEBIT,
tva as tvabis left join cptplan as CRE on CRE.IDCPTPLAN =
tvabis.IDCPTCREDIT
where
tva.numtva = tvabis.numtva
and tva.obsolete = 0

heureusement que j'ai un identifiant unique sur TVA. sinon ca ne serait
pas gérable.
Je crois que la version 5 a revu pas mal de choses au niveau de jointures
multiples, notamment pour régler ce genre de problème (pourtant simple)

Encore un grand merci à toi pour ton aide
Bon dev
Phil



I.G.LOG
Le #17239251
>
select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb ON deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre ON cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA




je n'y comprend plus rien, j'avais essayé sous Windev et avec un frontal en
ayant avec les deux l'erreur 1064. Mais maintenant ça marche !?
Pourtant j'étais persuadé qu'en 4.1 le second left join s'appliquait sur le
1er join, ici cptplan (au lieu de tva) ?!! Il me semblait même avoir vu une
évolution sur ces syntaxes avec la version 5 de MySQL.

Puis-je faire une jointure en cascade, du genre:

select *
from tva
left join cptplan on cptplan.IDCPTPLAN = tva.IDCPTDEBIT
left join autretable on autretable.IDENT = cptplan.IDCPTPLAN


??
Firetox
Le #17239241
> je n'y comprend plus rien, j'avais essayé sous Windev et avec un frontal
en ayant avec les deux l'erreur 1064. Mais maintenant ça marche !?



il y avait une erreur sur la requete : la derniere est bonne

1er join, ici cptplan (au lieu de tva) ?!! Il me semblait même avoir vu
une évolution sur ces syntaxes avec la version 5 de MySQL.



c'est vrai avec la syntaxe using ou on definit la cle du join mais la nature
(nomtable.nomcolonne = nomtable2.nomColonne)
la syntaxe using permet d'ecrire des choses comme ca

select
From matable
left join matable2 using (macle)
left join matable3 using (macle2)

la les left join sont cascade matable sur matable2 sur matable3
si on veut table sur matable2 et matable sur matable3 il faut passer par le
ON

select
From matable
left join matable2 ON matable.macolonne = matable2.macolonne
left join matable3 ON matable.macolonne = matable3.macolonne

par contre en 5 il n'est pas possible de melanger les 2 syntaxes using et on
car le moteur est un peu perdu
onne peut pas avoir :

select
From matable
left join matable2 using (macle)
left join matable3 ON matable.macolonne = matable3.macolonne


il faut tout passer en ON

voila

Bon dev
@+




"I.G.LOG" 48ceb59c$0$870$
>
select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb ON deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre ON cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA




je n'y comprend plus rien, j'avais essayé sous Windev et avec un frontal
en ayant avec les deux l'erreur 1064. Mais maintenant ça marche !?
Pourtant j'étais persuadé qu'en 4.1 le second left join s'appliquait sur
le 1er join, ici cptplan (au lieu de tva) ?!! Il me semblait même avoir vu
une évolution sur ces syntaxes avec la version 5 de MySQL.

Puis-je faire une jointure en cascade, du genre:

select *
from tva
left join cptplan on cptplan.IDCPTPLAN = tva.IDCPTDEBIT
left join autretable on autretable.IDENT = cptplan.IDCPTPLAN


??



Firetox
Le #17239231
bien entendu avec le message precedent tu te doute de la reponse


select *
from tva
left join cptplan on cptplan.IDCPTPLAN = tva.IDCPTDEBIT
left join autretable on autretable.IDENT = cptplan.IDCPTPLAN


??



oui bien sur et le ON permet tout les jointure que tu veux cascade ou non
le using n'est plus utilisé et comme il pose probleme depuis la 5 je ne
l'utilise plus
(en plus sur SQLServer le ON est compris aussi : ta requete fonctionnerait
sur SQLserver)

Bon dev
@+


"I.G.LOG" 48ceb59c$0$870$
>
select
LIBELLET,deb.COMPTE as CPTCREDIT,cre.COMPTE as CPTDEBIT,NUMTVA

from tva
left join cptplan as deb ON deb.IDCPTPLAN = tva.IDCPTDEBIT
left join cptplan as cre ON cre.IDCPTPLAN = tva.IDCPTCREDIT

where
OBSOLETE = 0

order by
NUMTVA




je n'y comprend plus rien, j'avais essayé sous Windev et avec un frontal
en ayant avec les deux l'erreur 1064. Mais maintenant ça marche !?
Pourtant j'étais persuadé qu'en 4.1 le second left join s'appliquait sur
le 1er join, ici cptplan (au lieu de tva) ?!! Il me semblait même avoir vu
une évolution sur ces syntaxes avec la version 5 de MySQL.

Puis-je faire une jointure en cascade, du genre:

select *
from tva
left join cptplan on cptplan.IDCPTPLAN = tva.IDCPTDEBIT
left join autretable on autretable.IDENT = cptplan.IDCPTPLAN


??



Publicité
Poster une réponse
Anonyme