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 :

Problème de requete Union, mais est ce vraiment la seule solution ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut Problème de requete Union, mais est ce vraiment la seule solution ?
    Bonjour à tous,

    je vais essayé de résumer ma requete pour que ça soit assez compréhensible.

    j'ai une table jeux qui contient une liste de jeux.
    et une table favoris jeux qui liste les jeux favoris d'un compte (une table du type id_jeux et email_compte)

    donc voila ma demande:
    je souhaite avoir la liste de tous les jeux avec les jeux mis en favoris affichés en premier puis un tri sur la variable note (note qui est un attribut de la table jeux).

    voila ma requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from jeux where id_jeux in (select id_jeux from favoris where email_compte="XXXX")
    UNION
    select * from jeux where id_jeux NOT IN (select id_jeux from favoris where email_compte="XXXX")
    cette requete fonctionne mais je ne peux pas trié les favoris en premier puis la note à cause de l'union.

    Est ce qq un a une autre solution ?

    Pr info j'utilise MySql
    d'avance merci

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    peux etre quelque chose dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from jeux j 
    left join favoris f
    on j.id_jeux=f.id_jeux
    order by f.id_jeux, note

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    peux etre quelque chose dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from jeux j 
    left join favoris f
    on j.id_jeux=f.id_jeux
    order by f.id_jeux, note
    mais dans ce cas je n'aurais qu'une liste restreinte de jeux (qui est en favoris) et non toute la liste avec les favoris en premier.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    Pour être sûr de bien comprendre :

    Soit un compte avec comme email marcel...

    Soient 5 jeux :
    • j1 : note de 10/20,
    • j2 : 13/20,
    • j3 : 8/20,
    • j4 : 17/20,
    • j5 : 2/20


    marcel... a comme jeux favoris : j3 et j5.

    Tu voudrais alors le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    jeux |  note  |  compte
    ------------------------------
    j3   |   8/20 | marcel...
    j5   |   2/20 | marcel...
    j4   |  17/20 | NULL
    j2   |  13/20 | NULL
    j1   |  10/20 | NULL

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    exactement

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM jeux j 
    LEFT JOIN favoris f
    ON j.id_jeux=f.id_jeux
    where email_compt ='xxx'
    ORDER BY case f.idjeux/f.id_jeux when 1 else 0 end desc, note desc
    ca devrait passer sauf en cas de note à 0

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Peut-être quelque chose de la sorte :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
      *
    FROM
      JEUX J
        LEFT JOIN
          FAVORIS F
        ON J.id_jeux = F.id_jeux
        AND F.email_compte = "marcel..."
    ORDER BY
      F.email_compte, J.note
    On fait une jointure externe sur la table JEUX, en prenant la précaution de n'avoir auparavant sélectionné que les jeux que marcel a mis en favoris.
    Cela devrait ramener tous les jeux : ceux de marcel et les autres.
    Puis on tri sur l'email pour avoir marcel en premier et NULL ensuite et sur la note.



    EDIT
    Grillé au poto !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Cybher Voir le message
    essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM jeux j 
    LEFT JOIN favoris f
    ON j.id_jeux=f.id_jeux
    where email_compte ='xxx'
    ORDER BY case f.id_jeux/f.id_jeux when 1 else 0 end desc, note desc
    ca devrait passer sauf en cas de note à 0
    j'obtiens une erreur sql:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'else 0 end DESC, note_classement_fr DESC

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Cybher Voir le message
    essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM jeux j 
    LEFT JOIN favoris f
    ON j.id_jeux=f.id_jeux
    where email_compt ='xxx'
    ORDER BY case f.idjeux/f.id_jeux when 1 else 0 end desc, note desc
    ca devrait passer sauf en cas de note à 0
    Une petite question :

    Le fait de mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where email_compt ='xxx'
    juste après la jointure externe ne va pas "annuler" l'effet de la jointure ?

    Je pense à une exécution de la requête comme ceci :
    1. Le SGBD fait la jointure externe
    2. Il exécute le where sur la table résultat, éliminant de ce fait les jeux que 'xxx' n'a pas en favoris

  10. #10
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    oui, en effet
    je n'avais pas fait attention à la table dans laquelle email_compte était

    donc avec ta requête, cela fonctionnera beaucoup mieux (il faut juste classer dans l'autre sens )

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    le problème avec ma requete c'est que je ne peux pas classer via la note car le order dans une requete union à un impact sur toute la table donc cela va reclasser le résultat et donc perdre les jeux en favoris listé en 1er.

    De plus dans une requete union il n'est "apparemment" pas possible de faire un order dans une des sous requetes d'union.

    A moins que vous ayez une solution ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Cybher et moi-meme t'avons donné des requetes qui n'utilisaient pas le UNION.

    Le ORDER BY est donc tout à fait applicable.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    désolé j'avais pas vu ta requete christophe.

    En effet elle fonctionne très bien.

    Juste une petite question. Je ne suis pas habitué à utilisé left join.
    Si j'ai bien compris elle effectue une préselection mais sans restreindre les données ? c'est bien ça ?

    un grand merci pour votre aide ))

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    En gros, le principe est le suivant :

    Soient deux tables Clients et Factures.

    La table Facture a un champ id_client pointant sur le client de la facture.

    Le but de la jointure externe est de prendre tous les clients : ceux qui ont une(des) facture(s) associée(s) et ceux qui n'en ont pas.

    Là où la jointure classique ne prend que les clients ayant une(des) facture(s), la jointure externe permet de garder toute la table client, puis de coller les factures seulement là où cela est possible.

    Un googlage de "jointure externe" te donnera plus de détails.

    Une dernière remarque : il existe LEFT JOIN et RIGHT JOIN. Les deux font la même chose, simplement LEFT JOIN garde toute la table gauche (LEFT) de la jointure alors que RIGHT JOIN garde toute la table de droite (RIGHT).


    --------------------------------

    Ensuite pour ce qui est de la restriction des données, je t'invite à lire ce sujet, et plus particulièrement les deux ou trois derniers messages.
    Le problème de la sélection avant/après la jointure y est abordé.

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *, 1 AS ORDRE
    FROM   jeux AS J
           INNER JOIN favoris as F
                 ON J.id_jeux = F.id_jeux
    WHERE email_compte= 'XXXX' --> apostrophes pas guillemets !!!
    UNION
    SELECT *, 2
    FROM   jeux 
    WHERE  id_jeux NOT IN (SELECT id_jeux 
                           FROM   favoris 
                           WHERE  email_compte='XXXX') --> apostrophes pas guillemets !!!
    ORDER  BY ORDRE, note
    Au passage les chaînes de caractères s'entourent d'apostrophe, pas de guillemets. Apprenez SQL avec mon cours ou mes livres !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Merci à tous pour votre aide et votre réactivité


Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2010, 14h15
  2. Problème requete union
    Par lanjolanjo dans le forum Langage SQL
    Réponses: 11
    Dernier message: 24/03/2009, 19h53
  3. Problème de configuration serveur web mais est-ce possible?
    Par e-m.guillaume dans le forum Apache
    Réponses: 3
    Dernier message: 19/02/2009, 09h55
  4. problème intégration, mais est ce possible ?
    Par ProActif dans le forum SpagoBI
    Réponses: 1
    Dernier message: 16/02/2009, 14h51
  5. Problème group by dans requete union
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 07/01/2008, 16h49

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