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 14/10/2011, 14h33   #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 Requetes imbriquées ou Jointures ?

Bonjour à tous,
je cherche à faire une requête assez complexe, mais je ne sais pas si c'est faisable:
j'ai 2 tables

Chaque éleve possède 3 ou n Livres.
Chaque livre appartient à 1 élève.
Chaque livre est d'un type ( soit 0 , soit 1 , soit 2 )

t_eleve(id_eleve,nom,prenom...)
t_livre(id_livre,id_eleve,titre,...,type_livre)

Je souhaite faire une requete qui me renvoi aléatoirement 3 livres par élèves, sauf que ces 3 livres doivent être le cas échant de type différent.

Faut-il faire ça avec des requêtes imbriquées ? ou des jointures ?
Merci pour votre aide.
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 15h20   #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,
Moi je ferais une requête qui me renvoie aléatoirement un livre de type 0 par élève
que je mettrais en UNION avec une requête qui me renvoie un livre de type 1 par élève que je mettrais en UNION avec une requête qui me renvoie un livre de type 2 par élève.
Il y a dans les sources de ce forum un modèle de requête pour retourner les n (ici n=1) premiers éléments d'une catégorie.
Désolé, je n'ai pas le temps de chercher le lien.
__________________
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 14/10/2011, 15h57   #3
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 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Maljuna Kris Voir le message
Il y a dans les sources de ce forum un modèle de requête pour retourner les n (ici n=1) premiers éléments d'une catégorie.
Désolé, je n'ai pas le temps de chercher le lien.
Voilà !
__________________
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 16/10/2011, 22h54   #4
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
Bonsoir à vous,
je ne comprend pas très bien ta proposition.
Je dois faire 3 INNER JOIN ? de ces 3 requêtes ? sur quel critère ?

Code :
1
2
3
SELECT * FROM t_livre WHERE id_artiste =xx AND type_livre=0 ORDER BY rand() LIMIT 1;
SELECT * FROM t_livre WHERE id_artiste =xx AND type_livre=1 ORDER BY rand() LIMIT 1;
SELECT * FROM t_livre WHERE id_artiste =xx AND type_livre=2 ORDER BY rand() LIMIT 1;
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 09h06   #5
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Non, tu dois faire des UNION ALL

En revanche, normalement, le ORDER BY est interdit avant une clause UNION. Donc selon si MySQL respecte ou non la norme SQL, la requête va marcher ou non.

Sinon, il reste certainement une solution avec les fonctions de fenêtrage.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 10h05   #6
Invité régulier
 
Inscription : janvier 2007
Messages : 122
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 122
Points : 8
Points : 8
J'avoue ne pas très bien comprendre.
Et si je fais une requête simple pour récupérer les ID de chaque élève, puis après je fais une boucle ou je récupère chaque livre ?
je pense que ce n'est pas très optimisé mais apparemment si je voudrais tout faire en 1 seule requête SQL, ça a l'air très complexe...

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT ids FROM t_eleve ORDER BY rand()
foreach(ids AS id)
{
 
$data1=SELECT * FROM t_livre WHERE id_artiste =id AND type_livre=0 ORDER BY rand() LIMIT 1;
$data2=SELECT * FROM t_livre WHERE id_artiste =id AND type_livre=1 ORDER BY rand() LIMIT 1;
$data3=SELECT * FROM t_livre WHERE id_artiste =id AND type_livre=2 ORDER BY rand() LIMIT 1; 
$result = array($data1["nom_livre"],$data2["nom_livre"],$data3["nom_livre"])
}
et à la fin j'ai un tableau $result qui contient 3 livres par élève, qu'en pensez vous ?
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 17h40   #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'avoue être carrément perdu là
rockt13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 17h51   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Et comme ça ?
Code :
1
2
3
4
5
SELECT e.id, e.nom, e.prenom,
       (SELECT l.titre FROM t_livre WHERE l.id_eleve = e.id_eleve AND l.type_livre = 0 ORDER BY rand() LIMIT 1) AS livre_type_0,
       (SELECT l.titre FROM t_livre WHERE l.id_eleve = e.id_eleve AND l.type_livre = 1 ORDER BY rand() LIMIT 1) AS livre_type_1,
       (SELECT l.titre FROM t_livre WHERE l.id_eleve = e.id_eleve AND l.type_livre = 2 ORDER BY rand() LIMIT 1) AS livre_type_2
  FROM t_eleve e
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h22.


 
 
 
 
Partenaires

Hébergement Web