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 :

Aide pour requete


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 120
    Points : 50
    Points
    50
    Par défaut Aide pour requete
    Bonjour,

    Je souhaite extraire des résultats d'une table et je cherche à savoir si c'est possible en une seule requête car moi je n'y arrive pas.

    J'ai une table dont la structure est composée des champs suivants :
    id (int), user_id (int),media_type (int),media_id (int),date_update(datetime)

    Je veux récupérer par exemple les dix enregistrements correspondant aux dix derniers media (media_type) de type X en sachant que je ne veux en prendre que un maximum pour un utilisateur (user_id)

    J'ai essayé les deux requêtes suivantes qui ne renvoient pas le résultat souhaité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT  user_id,media_type,media_id 
    FROM ma_table 
    WHERE media_type = 3 
    ORDER BY date_update DESC 
    LIMIT 0,10
    La clause distinct ne sert à rien car c'est le triplet des champs à renvoyer qui est pris en compte et lui est tout le temps unique à cause de la valeur media_id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT user_id,media_type,media_id 
    FROM ma_table 
    WHERE media_type = 3 
    GROUP BY user_id 
    ORDER BY date_update DESC 
    LIMIT 0,10
    Ne renvoie pas le résultat voulu, le tris par date ne semble pas être fait en premier.

    Si je décompose il me faut d'une part trié par date (date_update) mes enregistrements, sélectionner ceux qui sont du bon type (media_type) et en prendre autant que souhaité mais un seul par utilisateur ( user_id)

    Je ne suis pas sur que cela se fasse en une requête mais étant donné mon niveau je préfère me tourner vers vous.

    En vous remerciant

  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,

    et media_id dans tout cela?
    pas de critere de sélection?
    quand tu fais une clause group by, il faut normalement avoir une fonction d'agregation (max, min, ...) pour tes colonnes qui ne sont pas dans ton group by
    sinon il ne sélectionne pas forcément les bonnes valeurs

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Si j'ai bien compris le problème, ça doit donner quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT id,user_id,media_type,media_id, date_update
    FROM ma_table t1
    WHERE media_type = 1
    AND (
        SELECT COUNT(*)
        FROM ma_table t2
        WHERE t2.user_id = t1.user_id
        AND t2.media_type = t1.media_type
        AND t2.date_update > t1.date_update
    ) < 1
    ORDER BY date_update DESC
    LIMIT 0, 10
    L'idée, c'est de prendre le dernier media-type de chaque user, de trier par date et de ne garder que les 10 derniers résultats...
    A voir si c'est bien ce que tu souhaites .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 120
    Points : 50
    Points
    50
    Par défaut
    Tout d'abords merci de votre aide !
    Ced tu as parfaitement compris l'objectif.
    Est il possible que tu me détaille un peu ta requête là ?
    En fait je n'ai pas trop l'habitude des requêtes imbriqués et là tu sembles faire un test sur deux tables qui sont en fait la même. Est-ce pour vérifier que l'on ne traite qu'une seule fois un même utilisateur ?
    C'est le <1 qui me chagrine, j'aurai vu un truc genre <2 ... ce qui me fait penser que je n'ai pas bien compris ce que faisait cette requête imbriqué ;-)

    Merci encore

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ce type de requête s'appelle la division relationnelle.
    Pourquoi mettre < 1 et pas < 2 ? Parce que justement, on veut le dernier media-type de chaque user.
    Dans la sous-requête, on compte le nombre de lignes autre que celle en cours (puisque les dates de mise à jour sont différentes) avec une plus grande date, mais le même user et le même type de media. Pour être certain de ne garder que la date la plus récente, il faut donc que le résultat de cette sous-requête soit 0 (il n'y a pas de ligne plus récente), d'où le <1 .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 120
    Points : 50
    Points
    50
    Par défaut
    Merci bien pour l'explication !

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

Discussions similaires

  1. Aide pour Requete (compteur specifique)
    Par DreamerCG dans le forum Requêtes
    Réponses: 1
    Dernier message: 13/07/2006, 10h34
  2. [OGS ?] Demande d'aide pour requete SQL
    Par hamtary dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2006, 12h58
  3. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39
  4. aide pour requete sur 2 tables avec clé étranere
    Par richton95 dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2005, 13h32
  5. [SQL] aide pour requete UPDATE SVP
    Par ganok dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/03/2005, 09h17

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