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 :

Requête contenant une jointure aléatoire


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Requête contenant une jointure aléatoire
    Bonjour tout le monde,

    j'aurais besoin de vous pour m'aider à réaliser une requête. Je vous explique:

    J'ai 2 tables (pour une application PHP, utilisant SQL):

    - "albums_list" avec une colonne "album_id" qui sert à identifier l'id d'un album et une colonne "album_date" qui contient la date de validation de l'album
    - "photos_list" avec une colonne "ph_id" qui sert à identifier l'id de la photo et une colonne "ph_album_id" qui sert à identifier l'id de l'album auquel la photo appartient.

    Sur ma page d'accueil, je récupère les 4 derniers albums validés, ainsi que la première photo de l'album correspondant.

    Ma requête se présente donc sous cette forme:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        a.album_id, 
        ph.ph_id
    FROM albums_list AS a 
        LEFT JOIN photos_list AS ph ON ph.ph_id=(SELECT ph_id FROM photos_list WHERE ph_album_id=a.album_id LIMIT 0, 1)
    ORDER BY a.album_date DESC LIMIT 0, 4

    Tout ceci fonctionne très bien, pas de problème jusqu'ici.

    Maintenant, j'aimerais modifier cette requête afin de récupérer non pas la première photo de l'album, mais bien une photo aléatoire de l'album.

    J'ai bien essayé d'ajouter un "ORDER BY RAND() LIMIT 0, 1" dans la sous-requête, mais cela ne fonctionne pas.

    J'en viens donc à vous: comment réaliser cette requête?

    Merci d'avance, et bonne journée.

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Salut,
    et si tu faisais tout simplement un rand sur le ph_id ?

    A+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Un rand sur le ph_id dans la sous requête? J'ai bien essayé, mais soit il me sort un id aléatoire (comme je le souhaite), soit il ne me sort pas de résultat...

  4. #4
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Avec 2 fonctions non déterministes, LIMIT et RAND, bon courage.

    Je ne connais pas mysql qui a des fonctions assez spéciales. Je me suis inspiré de l'exemple de la doc mysql de rand
    Je penserais à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
        a.album_id, 
        b.ph_id
    FROM albums_list AS a 
        LEFT JOIN 
        (
            SELECT album_id 
            FROM albums_list , photos_list  
            WHERE ph_album_id=album_id
            ORDER BY RAND() LIMIT 0,1
        ) AS b 
        ON a.album_id=b.ph_album_id )
    ORDER BY a.album_date DESC LIMIT 0, 4
    Ce que je voulais dire c'est qu'il faut mieux mettre la sous-requêtes aléatoires au niveau du FROM, comme je l'ai fait, qu'au niveau l'opérande droite de l'opérateur "=" de jointure comme tu l'as fait.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Normalement tu devrais avoir la possibilité de faire un rand que sur une partie souhaitée (par exemple : entre 1 et 100) ce qui permettrait de résoudre ces résultats NULL parfois.

    Edit : Sous oracle tu as ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DBMS_RANDOM.INITIALIZE (
       val  IN  BINARY_INTEGER);

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bon, j'ai réussi à faire ce que je souhaitais avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT
        a.album_id,
        (SELECT ph_id FROM photos_list WHERE ph_album_id = a.album_id ORDER BY rand() LIMIT 1) ph_id
    FROM albums_list a
    ORDER BY a.album_date DESC LIMIT 4
    Je verrai si les performances restent acceptables avec un grand nombre d'albums photos.

    Merci pour votre aide.

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

Discussions similaires

  1. [1.x] Récupérer le résultat de requête suite à une jointure
    Par avalon50 dans le forum Symfony
    Réponses: 3
    Dernier message: 26/10/2009, 13h11
  2. Requête contenant des variables aléatoires
    Par manucha dans le forum SQL
    Réponses: 3
    Dernier message: 16/09/2009, 15h52
  3. Requête avec une jointure multitables
    Par thefleo dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2009, 09h07
  4. [ZF 1.5] Jointure externe contenant une jointure interne...
    Par Eusebe dans le forum Zend_Db
    Réponses: 1
    Dernier message: 25/04/2008, 14h10
  5. Remplacer une sous-requête par une jointure
    Par MPQuatre dans le forum Requêtes
    Réponses: 6
    Dernier message: 05/12/2007, 17h28

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