IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de donn�es Discussion :

[SQL] Pb conditions sur tables multiples


Sujet :

PHP & Base de donn�es

  1. #1
    Membre Expert
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Par d�faut [SQL] Pb conditions sur tables multiples
    Bonjour, j'ai un petit de souci de requ�te comme vous pouviez vous en douter.

    Voil� le sch�ma simplifi� de mes tables.
    Table user : nom,prenom,iduser

    Table groupe : idgroupe, nom

    Table messages : idmess, iduser, idgroupe, texte


    Sachant qu'un message peut �tre adress� SOIT � un user (iduser != -1 et idgroupe = -1) SOIT � un groupe (idgroupe != -1 et iduser = -1) je cherche � r�cup�rer suivant les cas

    -> Le nom du groupe (si c'est destin� au groupe)
    ou bien
    -> Les noms et pr�noms de l'utilisateur (si c'est destin� � l'utilisateur)

    J'ai tent� avec un case mais sans succ�s....

    Un coup de main serait le bienvenue,

    en vous remerciant par avance.
    Ex d�veloppeur Php / J2EE.
    Actuellement reconverti � SharePoint 2013

    Mon blog SP 2013

  2. #2
    Membre chevronn�
    Avatar de DBProg
    Profil pro
    �tudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Par d�faut
    Salut !

    Je te propose une solution qui fonctionne, mais elle n'est pas tr�s optimis�e (du moins je pense). Je suis �galement ouvert � toute optimisation, je ne connais pas trop les CASE en SQL encore.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    SELECT M.idmess, M.texte, IF(M.iduser IS NULL, (
    SELECT idgroupe, nom FROM groupe G WHERE G.idgroupe = M.idgroupe),
    (SELECT iduser, nom, prenom FROM user U WHERE U.iduser = M.iduser))
    FROM messages M
    Comme tu peux le constater j'ai utilis� IS NULL pour la condition. Car en fait je te conseille de mettre l'une des deux valeurs (celle qui n'est pas renseign�e) � NULL et non � -1. C'est plus propre, et c'est fait pour !
    La vitesse de la lumi�re �tant sup�rieure � la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parl�
    -----------------------------------------------------------
    Retrouvez mes articles informatique sur mon Site Developpez.
    Le reste, sur le Site perso !


  3. #3
    Membre �prouv�
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    D�tails du profil
    Informations personnelles :
    �ge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Par d�faut
    Re-salut :-)

    un UNION me semble tout indiqu�.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    SELECT nom, prenom, texte FROM messages JOIN user USING(iduser)
    UNION
    SELECT nom, '/' as 'prenom', texte FROM messages JOIN groupe USING(idgroupe)
    remarque que je triche un peu pour le groupe en cr�ant un pseudo champ prenom dans la requete (je mets arbitrairement la valeur "/") afin de calquer la structure de cette requete sur la premiere pour que le UNION marche.


    Si tu peux cr�er � la vol�e pour chaque ligne l'info type de destinataire en cr�ant �galement le pseudoi champ 'type_detin'
    remarque que structurellement parlant, les diff�rentes requetes qui composent le UNION doivent rester "superposables" (m�me champs et dans le m�me ordre):

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    SELECT 'Utilisateur' AS 'type_dest', 'nom, prenom, texte FROM messages JOIN user USING(iduser)
    UNION
    SELECT 'Groupe' AS 'type_dest', nom, '/' as 'prenom', texte FROM messages JOIN groupe USING(idgroupe)
    Bon et le fin du fin, si tu veux garder la possibilit� de brasser, ordonner, grouper etc. les resultats dans leur globalit� (par ex pas de clause order pour UNION), et si ton serveur SQL est > 4.1 (je te guarantie rien pour les versions plus anciennes)
    Tu peux faire comme si cette requete audessus �tait une table que tu peux manipuler (classer par nom par exemple) en fait :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT type_dest, nom, prenom, texte FROM
    (
    SELECT 'Utilisateur' AS 'type_dest', nom, prenom, texte FROM messages JOIN user USING(iduser)
    UNION
    SELECT 'Groupe' AS 'type_dest', nom, '/' as 'prenom', texte FROM messages JOIN groupe USING(idgroupe)
    ) AS DERIVED_TABLE
    ORDER BY nom
    sans aller jusqu'a la sophistication de la derni�re pense toujours a ca : les requetes (autant que tu veux en fait) reli�es par un UNION doivent �tre toutes superposables en structures.


    Table user : nom,prenom,iduser

    Table groupe : idgroupe, nom

    Table messages : idmess, iduser, idgroupe, texte

  4. #4
    Membre Expert
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Par d�faut
    Alors une petite pr�cision pour rajouter un peu de piment (sinon c'est d�finitivement pas marrant hein )

    Je ne peux pas mettre mes champs � NULL �tant donn� que c'est une base utilis�e par un soft et que celui qui en a fait la conception devait pas �tre bien r�veill� ce jour l�. Donc en r�sum� TOUS les champs doivent �tre remplis alors pour gruger ils calent des espaces dans les champs qui ne contienent rien.

    Ensuite pour la version SQL>4.1 aucune id�e �tant donn� que je suis sous Oracle8i

    Je vais tester avec la version de Gisele mais il faut que j'arrive � tout piger

    EDIT : j'ai test� et ... �a ne fonctionne pas

    Voil� ma requ�te (inspir�e de la 1�re de gisele) avec les vrais noms de champs (attention �a fait mal aux yeux)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     SELECT 
    USR_0,  // iduser (table AUTILIS & XMESSAGES) --> -1 ou valeur
    NOMUSR_0, // nom (table AUTILIS)
    PRENOMUSR_0,  // prenom (table AUTILIS)
    XCHRONO_0, // index message (table XMESSAGE)
    TEXTE_0, // texte message (table XMESSAGE)
    GROUPE_0, // groupe destinataire (table XMESSAGE) --> -1 ou valeur
    INTITDROIT_0 // nom du groupe (table XDROITS)
       FROM XMESSAGES JOIN AUTILIS USING(USR_0)
    WHERE XCHRONO_0=1
    UNION 
      SELECT 
    USR_0, 
    NOMUSR_0, 
    '/' AS 'PRENOMUSR_0', 
    XCHRONO_0, 
    TEXTE_0, 
    GROUPE_0, 
    INTITDROIT_0 
      FROM XMESSAGES JOIN XDROITS USING (GROUPE_0)
    WHERE XCHRONO_0=1
    J'ai pas bien compris l'histoire du / as prenom non plus

    Merci de m'�clairer de vos lumi�res et de prendre le temps de me r�pondre
    Ex d�veloppeur Php / J2EE.
    Actuellement reconverti � SharePoint 2013

    Mon blog SP 2013

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    D�tails du profil
    Informations personnelles :
    �ge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Par d�faut
    bah si si t'as la main sur ta base genre avec phpmyadmin, clique sur SQL et patate une des requetes, elles sont pretes pour l'emploi.

    Pour etre plus clair, UNION sert � cumuler les resultats de 2 ou plusieurs requetes a conditions qu'elles aient la m�me gueule. (memes noms/structures de champs dans la clause SELECT)

    par exemple, je cumule dans le m�me jeu d'enregistrement

    un select sur les messages des user + un select sur lesmessages des groupes

    mon premier ex , le plus simple renvoie tous les message pour user suivi de tous le smessages pour groupe, en comblant le champ 'prenom' avec "/" pour le cas groupe.


    Mon 2 eme exemple ajoute un champs qui stipule quel type dedestinataire
    en terme de retour ca afficherait quelque chose comme ��:

    type_dest | nom | prenom | message
    Utilisateur | DUPOND | paul | son_messageblablasdfsd
    Utilisateur | Janvion | Gerard| son_messageblabla_a_gerard
    Utilisateur |Zimako | Jacques | son_messageblablahdskjfhsd
    Groupe |groupe1| / | son_messageblabla_au_groupe1
    Groupe |groupe2 |/ |son_messageblablahdskjfhsd_groupe2

    Mon 2 eme exemple englobe ces resultat dans une pseudo table form�e par une sousrequete (la meme que l'exemple 2) de maniere a pouvoir manipuler la table (ORDER BY, GROUP BY etc.), chose impossible avec dans chacune des requetes UNION.

    je classe par nom les resultat au dessus (order by nom) et ca donne :

    type_dest | nom | prenom | message
    Utilisateur | DUPOND | paul | son_messageblablasdfsd
    Groupe |groupe1| / | son_messageblabla_au_groupe1
    Groupe |groupe2 |/ |son_messageblablahdskjfhsd_groupe2
    Utilisateur | Janvion | Gerard| son_messageblabla_a_gerard


    remarque : d'apres ce que tu me dit dans ton dernier post, tu peux rempacer '/' par NULL (sans les quotes) pour obtenir des champs vides.
    Utilisateur |Zimako | Jacques | son_messageblablahdskjfhsd

Discussions similaires

  1. Conditions sur tables jointes
    Par KpTn dans le forum Hibernate
    R�ponses: 1
    Dernier message: 12/10/2007, 10h17
  2. [SQL] Probl�me condition sur 1 table
    Par Dwain dans le forum Langage SQL
    R�ponses: 3
    Dernier message: 27/02/2007, 19h51
  3. [Oracle] Pb conditions sur tables multiples
    Par guitou12 dans le forum Langage SQL
    R�ponses: 2
    Dernier message: 04/08/2006, 15h48
  4. [Access] requete sql avec condition sur date
    Par qeja dans le forum Langage SQL
    R�ponses: 4
    Dernier message: 25/03/2006, 23h54
  5. Condition sur un multiple de ....!
    Par Orakle dans le forum Access
    R�ponses: 2
    Dernier message: 08/03/2006, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo