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

Langage SQL Discussion :

Regroupement de plusieurs informations


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Regroupement de plusieurs informations
    Bonsoir,

    Je me décide enfin à demander votre aide après plus d'une journée à passer à chercher une solution ou une aide à mon problème.

    Je m'explique : je développe actuellement une application (PHP/MySQL) et souhaite extraire des données de plusieurs tables en une requête.

    Voici un schéma de ma base de données avec les tables concernées :


    Je souhaite créer un profil pour chaque membre. Sur celui-ci sera visible un historique de ses actions (un peu comme Facebook)
    Profil de Jean :
    "Jean a commenté cette fiche"
    "Jean a noté cette fiche"
    Etc...
    Afin de vous situer, une fiche peut être une vidéo ou un jeu.
    En gros, avec l'id de mon membre, je peux obtenir toutes les fiches qu'il a noté, commenté, ajouté en favoris, rédigé, les parties qu'il a joué, mais aussi son statut et son humeur.
    Je souhaite donc récupérer en une requête toutes les actions de mon membre, et limiter les résultats, car je pense que ce sera moins lourd que faire une requête pour chaque table, tout récupérer ensuite dans un tableau en PHP et le trier (et moins chiant faut l'avouer)
    Ces actions seraient triées par date (d'où la présence des champs commençant par dt dans chaque table).

    J'ai essayé d'utiliser les union, jointures, ai relu le cours de SQL sur les jointures et regroupement, mais rien n'a marché.

    J'ai pensé aussi à créer une vue mais sans succès.
    Malheureusement mes connaissances en SQL ne sont pas très poussées.

    Quelques essais :
    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
    23
    24
     
    SELECT *
    FROM Favori fa, Partie p, Noter n, Commenter c, Membre m, Statut s, Afficher a, Humeur h
    WHERE m.id = fa.idMembre
    AND m.id = p.idMembre
    AND m.id = n.idMembre
    AND m.id = c.idMembre
    AND m.id = s.idMembre
    AND m.id = a.idMembre
    AND m.id = "1"
    ORDER BY 
    (
    	SELECT dtFavori FROM Favori WHERE idMembre="1"
    	UNION
    	SELECT dtPartie FROM Partie WHERE idMembre="1"
    	UNION
    	SELECT dtNote FROM Noter WHERE idMembre="1"
    	UNION
    	SELECT dtCom FROM Commenter WHERE idMembre="1"
    	UNION
    	SELECT dtStatut FROM Statut WHERE idMembre="1"
    	UNION
    	SELECT dtHumeur FROM Afficher WHERE idMembre="1"
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
    FROM Favori f, Partie p, Noter n, Commenter c, Statut s, Afficher a
    WHERE f.idMembre = 1
    OR p.idMembre = 1
    OR n.idMembre = 1
    OR c.idMembre = 1
    OR s.idMembre = 1
    OR a.idMembre = 1
    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
    23
    24
     
    SELECT idFiche
    FROM Favori 
    WHERE idMembre = 1
    UNION
    SELECT id
    FROM Partie 
    WHERE idMembre = 1
    UNION
    SELECT idFiche
    FROM Noter 
    WHERE idMembre = 1
    UNION
    SELECT id
    FROM Commenter 
    WHERE idMembre = 1
    UNION
    SELECT id
    FROM Statut 
    WHERE idMembre = 1
    UNION
    SELECT idHumeur
    FROM Afficher 
    WHERE idMembre = 1
    Sur cette dernière je récupère bien les résultats, mais comment savoir à quoi ils correspondent?

    Peut-être que je m'y prends mal, peut-être que c'est impossible ^^"
    J'espère que vous saurez m'apporter une réponse

    Cordialement.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il n'est pas du tout évident que faire ça en une seule requête soit une bonne idée, mais admettons pour le principe.

    Dans ce cas, l'UNION est la bonne direction mais sur la conception de la requête, actuellement tu prends un peu le problème à l'envers.
    En effet, la 1ere chose à se demander, c'est quelle est la structure du résultat à obtenir, sous la forme d'une liste de colonnes. Sur ce problème particulier ça ne parait pas du tout trivial.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci Estofilo pour ta réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    idFiche  
    ----------- 
    2
    3
    13
    14
    15
    4
    5
    6
    8
    10
    Voila le type de résultat obtenu avec ma requête qui utilise des UNION. En effet, c'est ce que je recherche, mais comment savoir à quelle table cet identifiant appartient?

    Y'a-t-il un moyen d'avoir un résultat de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    id          table
    ----------- ----------- 
    2           noter
    3           noter
    13          favori
    14          favori
    15          favori
    4           commenter
    5           commenter
    6           commenter
    8           commenter
    10          partie

    Cordialement.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    hmm,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT idFiche, 'Favori'
    FROM Favori 
    WHERE idMembre = 1
    UNION
    SELECT id, 'Parti'
    FROM Partie 
    WHERE idMembre = 1
    ...

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par punkoff Voir le message
    hmm,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT idFiche, 'Favori'
    FROM Favori 
    WHERE idMembre = 1
    UNION
    SELECT id, 'Parti'
    FROM Partie 
    WHERE idMembre = 1
    ...
    Je ne savais pas qu'on pouvait faire ça Oo
    Comme quoi on en apprend tous les jours!
    En tout cas ça marche très bien! Merci

    Voila ma requête finale qui me fournit bien le tout et effectue un tri par date
    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
    23
    24
    25
    26
    27
    28
    29
     
    SELECT * FROM 
    (
    	SELECT idFiche, dtFavori, 'Favori'
    	FROM Favori 
    	WHERE idMembre = 1
    	UNION
    	SELECT id, dtPartie, 'Partie'
    	FROM Partie 
    	WHERE idMembre = 1
    	UNION
    	SELECT idFiche, dtNote, 'Noter'
    	FROM Noter 
    	WHERE idMembre = 1
    	UNION
    	SELECT id, dtCom, 'Commenter'
    	FROM Commenter 
    	WHERE idMembre = 1
    	UNION
    	SELECT id, dtStatut, 'Statut'
    	FROM Statut 
    	WHERE idMembre = 1
    	UNION
    	SELECT idHumeur, dtHumeur, 'Humeur'
    	FROM Afficher 
    	WHERE idMembre = 1
    ) 
    AS Profil
    ORDER BY dtFavori DESC
    Merci pour votre aide à tous les 2 Estofilo et punkoff, ça va me permettre d'avancer


    Bonne journée


    Cordialement.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Utilisez UNION ALL à la place de UNION, comme vous avez des variables en dur vous ne risquez pas d'avoir de doublons.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi de plusieurs informations par soap
    Par thyshimrod dans le forum Services Web
    Réponses: 3
    Dernier message: 13/06/2007, 11h05
  2. problème de post de plusieurs informations
    Par lordsaka dans le forum Langage
    Réponses: 1
    Dernier message: 21/05/2007, 08h30
  3. [pbm] regroupement par plusieurs booléen ET par montant vide.
    Par gribouille dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2007, 12h05
  4. Regroupement de plusieurs formulaires
    Par elkhy dans le forum Access
    Réponses: 2
    Dernier message: 24/05/2006, 18h49
  5. Plusieurs informations clients
    Par piloumoi dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/06/2005, 14h34

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