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

Requêtes MySQL Discussion :

Une jointure ?


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut Une jointure ?
    Bonjour à tous, voici mon PB
    (avec des tables alégées )
    j'ai donc une table :

    t_artistes
    -id

    et une table

    t_oeuvres:
    -id
    -id_artiste
    -image

    Un artiste peut avoir 1 ou n oeuvres .
    Je veux faire une requete qui me permette de récupérer pour chaque artiste une de ces oeuvre aléatoirement.

    Moi j'ai fait untruc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT a.id as id_artiste,o.image FROM t_artistes a,t_oeuvres o
    order by rand() 
    limit 9
    Sauf que j'ai des doublons, donc j'ai tenté ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.id AS id_artiste, o.image, a.nom
    FROM t_oeuvres o
    INNER JOIN t_artistes a ON o.id_artiste = a.id
    GROUP BY a.id
    ORDER BY rand( )
    J'ai bien pile poile mes 9 artistes, sauf que j'ai tjrs les memes oeuvres, si je réexecute plusieurs fois la requete...
    J'espere avoir été clair,
    Merci d'avance pour votre soutient

    COrdialement;

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Peut-être comme ça
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.id AS id_artiste, o.image, a.nom
    FROM t_artistes a, 
    (SELECT image, id_artiste
            FROM t_oeuvres
            WHERE id_artiste=a.id
            ORDER BY rand()
            LIMIT 1) o
    ORDER BY id_artiste
    Mais la sous-requête est corrélée et MySQL va chuter en performances
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut
    Bonjour Maljuna
    J'ai testé ta réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.id AS id_artiste, o.image, a.nom
    FROM t_artistes a, 
    (SELECT image, id
            FROM t_oeuvres
            WHERE id_artiste=id
            ORDER BY rand()
            LIMIT 1) o
    ORDER BY id_artiste
    mais dans la colonne image, j'ai la même image pour tous les artistes

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    Bonjour Maljuna
    J'ai testé ta réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.id AS id_artiste, o.image, a.nom
    FROM t_artistes a, 
    (SELECT image, id
            FROM t_oeuvres
            WHERE id_artiste=id
            ORDER BY rand()
            LIMIT 1) o
    ORDER BY id_artiste
    mais dans la colonne image, j'ai la même image pour tous les artistes
    Ce n'est pas ma requête, dans la sous-requête MySQL devrait tousser sur la colonne id.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut
    En fait si j'utilise ta réponse tel quel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.id AS id_artiste, o.image, a.nom
    FROM t_artistes a, 
    (SELECT image, id_artiste
            FROM t_oeuvres
            WHERE id_artiste=a.id
            ORDER BY rand()
            LIMIT 1) o
    ORDER BY id_artiste
    ça ne fonctionne pas, car il me dit ne pas connaitre la colonne a.id
    et le fait d'avoir a.id => id_artiste et id_artiste dans la 2eme requête c'est pas gênant? pas d’ambiguïté pour SQL ?

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Au temps pour moi, mais vu l'heure matutinale à laquelle j'ai posté, ce n'est pas surprenant.
    Dans la sous-requête, la corrélation doit être recherchée autrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.id AS artiste, o.image, a.nom
    FROM t_artistes a, 
    (SELECT image, id_artiste
            FROM t_oeuvres
            WHERE artiste=id_artiste
            ORDER BY rand()
            LIMIT 1) o
    ORDER BY id_artiste
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut
    J'ai ce message d'erreur:

    #1054 - Unknown column 'artiste' in 'where clause'

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je soumets une autre idée sans garantie que ça fonctionne.

    Requête 1 : Je crée une table temporaire qui reprend la table t_oeuvres en la classant par artiste puis aléatoirement. Les ouvres de chaque artiste devraient donc être classées aléatoirement.

    Requête 2 : Je modifie la table temporaire en y ajoutant un identifiant auto-incrémenté, ce qui va permettre de classer les lignes de la table.
    Artiste 1 : ligne 1 à N
    Artiste 2 : ligne N+1 à X...

    Requête 3 : Je sélectionne l'id mini pour chaque artiste et je récupère l'identifiant et l'image de l'oeuvre.

    La procédure complète :
    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
    CREATE TEMPORARY TABLE art_ovr
    SELECT id_artiste, id AS id_oeuvre, image
    FROM t_oeuvres
    ORDER BY id_artiste, RAND();
     
    ALTER TABLE art_ovr
    ADD COLUMN id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY;
     
    SELECT ao.id_artiste, ao.id_oeuvre, ao.image
    FROM art_ovr ao
    INNER JOIN 
    (
        SELECT id_artiste, MIN(id) AS maxid
        FROM art_ovr
        GROUP BY id_artiste
    ) tmp 
        ON tmp.maxid = oa.id
     
    DROP TABLE art_ovr;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    En fait, je crois qu'il faut plutôt procéder comme cela
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.id AS artiste, 
           (SELECT image FROM t_oeuvres 
            WHERE artiste=id_artiste
            ORDER BY rand()
            LIMIT 1) AS image,
            a.nom
    FROM t_artistes a
    ORDER BY id_artiste
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut
    Merci à vous.
    Ceci semble bien fonctionner , merci maljuna

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.id AS artiste, 
           (SELECT image FROM t_oeuvres 
            WHERE artiste=id_artiste
            ORDER BY rand()
            LIMIT 1) AS image,
            a.nom
    FROM t_artistes a
    ORDER BY artiste

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

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. un count sur une jointure et ca ne fonctionne pas
    Par elbronziero dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2004, 11h23
  3. probleme d'espace qui fausse une jointure
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/08/2004, 11h52
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. Lignes en double dans le résultat d'une jointure
    Par ledevelopeur dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 18h10

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