Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/03/2011, 18h44   #1
Invité régulier
 
Inscription : janvier 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 21
Points : 5
Points : 5
Par défaut Problème avec RIGHT JOIN et derniere id

Bonsoir, j'ai un petit souci avec une requête sql, en faite j'ai deux tables
client_facturation et client_livraison.

Dans chacune d'entre elles il y a les coordonnées des clients, mais pour client_livraison ce n'est pas obligatoire. En effet le client peut très bien recevoir sa commande chez lui ou faire un cadeau.

Dans un second temps le client peut à tout moment modifier ses coordonnées de facturation et/ou de livraison. De plus toutes les coordonnées sont gardées dans la BDD pour avoir un historique.

Donc il est possible de ce retrouver avec 5 adresses de facturation et 3 adresses de livraison pour un même client.
Voici enfin ma question, comment faire pour avoir le dernier enregistrement de facturation et de livraison pour un client le tout en une seule requête?

Structure des deux tables

table client_facturation
id_fact auto_increment
...données....
fk_id_membre id du client

table client_livraison
id_livr auto_increment
...données....
fk_id_membre id du client


Code :
1
2
3
4
5
 
$req_pays2 = mysql_query("							
SELECT *
FROM client_livraison AS cl
RIGHT JOIN client_facturation AS cf ON cl.fk_id_client = cf.fk_id_client");
jounax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 19h03   #2
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
Tu ne donnes pas assez d'info, là tel quel tu ne peux pas avoir ce que tu veux.

Tu peux poster la structure des tes 2 tables ?
samael314 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 19h31   #3
Invité régulier
 
Inscription : janvier 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 21
Points : 5
Points : 5
Voila les 2 tables

client_facturation(id_c_f ,civilite_c_f , nom_c_f ,prenom_c_f ,num_adr_c_f , nom_adr_c_f , cp_c_f , commune_c_f, id_pays, #fk_id_client)

client_livraison(id_c_l ,civilite_c_l , nom_c_l , prenom_c_l, num_adr_c_l, nom_adr_c_l , cp_c_l, commune_c_l, id_pays, #fk_id_client)

Sachant que c'est deux tables on chacune une clé étrangère "fk_id_client" qui porte sur la table client

client(id_client, login_client, mdp_client, email_client)


Contrainte d'intégrité référentielle

-> fk_id_client fait référence à id_client de client
jounax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 19h39   #4
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
Je n'aurais pas adopté cette stucture, tu as des infos redondantes.

( En gros : Plutôt une table client principale, id client, raison sociale
Une table avec n adresses possibles, dont une principale (par défaut)
Quand le client passe commande ils choisi son adresse de livraison et c'est dans la table ou tu stocke les commandes que tu référence (avec clés étangères sur la table des adresse) l'adresse de livraison. Même logique pour la facturation)


Sinon de ce que je vois tu ne peux stocker dans chaque tabes qu'une seule adresse par id client, donc au total tu ne peux avoir que 2 adresses possibles et non 5 non ?

Dans ce cas tu prend soit l'adresse de client_livraison si elle est renseigné, sinon l'adresse de client_facturation. Je ne vois pas les champs qui s'auto incrémentent dans les définitions que tu m'as donné
samael314 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 19h56   #5
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
Par rapport à ce que tu décris dans ton premier message, si les champs qui s'auto-incrémentent sont id_c_l et id_c_f j'aurais imaginé quelque chose comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
case livr.adress when = NULL then livr.adress else fact.adress end
FROM
client_facturation fact
LEFT JOIN client_livraison livr ON
 
livr.#fk_id_client = fact.#fk_id_client
AND livr.id_c_l = (SELECT max(maxlivr.id_c_l)
FROM client_livraison maxlivr
WHERE maxlivr.#fk_id_client = #fk_id_client)
 
WHERE
 
fact.id_c_f = (SELECT max(maxfact.id_c_f)
FROM client_facturation maxfact
WHERE maxfact.#fk_id_client = fact.#fk_id_client)
ps : j'arrive pas à mettre des indentations correctes, désolé...
samael314 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/03/2011, 20h22   #6
Invité régulier
 
Inscription : janvier 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 21
Points : 5
Points : 5
Citation:
Je n'aurais pas adopté cette stucture, tu as des infos redondantes.
Non rien de redondant puisque lorsque le client s'enregistre seul les tables client et client_facturation sont remplis et les données dans client_facturation, client_livraison et client sont différentes.

Citation:
Sinon de ce que je vois tu ne peux stocker dans chaque tables qu'une seule adresse par id client, donc au total tu ne peux avoir que 2 adresses possibles et non 5 non ?
Si je peux avoir autant d'adresse que je veux par client puisque les adresses sur les 2 tables (client_facturation, client_livraison) on un id auto_incrément qui les définis et l'id de client.

Donc si un membre change d'adresse de facturation il peut le renouveler sur le site avec un INSERT INTO qui s'exécute derrière et non un UPDATE pour garder un trace pour l'historique. Donc l'id du membre peut se retrouver de 1 à N lignes d'enregistrement, et pareil pour l'adresse de livraison. D'ou la nécessiter de :

->Si il n'y a pas d'adresse de livraison cela veut dire que c'est la même que l'adresse de facturation donc une jointure normal pose problème si il n'y pas d'enregistrement dans client_livraison.
->Si le client à déjà enregistré N adresses dans client_livraison et client_facturation, il faut récupérer que la dernière adresse enregistrée en fonction du plus grand id auto-incrément avec l'id du client.


je viens de voir ton message plus haut, je test tout de suite, merci.
jounax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 21h46   #7
Invité régulier
 
Inscription : janvier 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 21
Points : 5
Points : 5
Et bien merci je viens de tester la requête qui fonctionne.
j'ai juste mis le CASE entre parenthèse avec alias pour rajouter quelques champs.

Encore merci pour les conseils et ton aide.
jounax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 09h20   #8
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
samael314 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h20.


 
 
 
 
Partenaires

Hébergement Web