Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 20/09/2011, 23h52   #1
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
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 :
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 :
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;
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 06h03   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Peut-être comme ça
Code mysql :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 07h32   #3
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
Bonjour Maljuna
J'ai testé ta réponse
Code :
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
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 09h02   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par rockt13 Voir le message
Bonjour Maljuna
J'ai testé ta réponse
Code :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 09h27   #5
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
En fait si j'utilise ta réponse tel quel:
Code :
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 ?
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 09h51   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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 :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h12   #7
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
J'ai ce message d'erreur:

#1054 - Unknown column 'artiste' in 'where clause'
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h13   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h13   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
En fait, je crois qu'il faut plutôt procéder comme cela
Code mysql :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h20   #10
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
Merci à vous.
Ceci semble bien fonctionner , merci maljuna

Code :
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
rockt13 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 18h53.


 
 
 
 
Partenaires

Hébergement Web