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 :

DISTINCT couplé d'un SELECT ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut DISTINCT couplé d'un SELECT ?
    Voila, imaginons une table formé comme ceci
    ID | TYPE | VALEUR
    1 | X | 1
    2 | Y | 2
    3 | X | 3
    4 | Y | 4
    5 | X | 5
    6 | Y | 6

    Je voudrais formuler une requête qui correspondrait à:
    "Récupérer les 2 dernières valeurs de chaque type"

    En gros, un 'SELECT DISTINCT type' couplé à un 'SELECT [...] WHERE type=type LIMIT 0,2'
    Je sais que GROUP BY permet de recuperer les doublons, ça se rapproche de ce que je veux mais c'est pas ça

    Pour l'instant, je recupère les types par un SELECT DISTINCT et je fais un SELECT [...] LIMIT 0,2 par derrière, mais sur 83000 enregistrements et 25 types, cela prend ennormément de temps (+ de 1 minute)

    Si vous avez une idée .. merci d'avance

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    voila une solution parmis tant d'autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    select MaTable.id, MaTable.type,MaTable.valeur from
    (select max(id) as id, type from MaTablegroup by type) requete1, MaTable
    where MaTable.id = requete1.id
    Bon courage

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Je ne comprend pas très bien la requête, cela revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table group by type order by id desc
    non ?

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Autant pour moi, ca revient a faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select max(id) as id, type from MaTable group by type
    cependant attention :

    Une requete de selection utilisant la clause Group By doit imperativement contenir une fonction d'agrégation (max, avg, count, min,sum).

    Désolé d'avoir surchargé ta requete mais je passe souvent par un sub select pour tester les requetes.
    J'espere que tu ne m'en tiendras pas rigueur

    Bon courage

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Je vois ! En faite je connaissais GROUP BY (Mais tu m'as appris qu'il fallait une fonction d'éagrégation avec :lol)

    En faite cela reviens à mon 1er post
    Je sais que GROUP BY permet de recuperer les doublons, ça se rapproche de ce que je veux mais c'est pas ça
    Ce que je voudrais, c'est le même effet mais avec les 2 derniers enregistrements de chaque type, et pas seulement un seul de chaque type.

    J'espère que le SQL permet cela, c'est très utile dans certains cas ! (Style "Afficher les 5 dernières news de chaque categorie")


  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Est ce que cette requete te convient ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select max(id), type from MaTable group by type union
    select max(e.id), e.type from(
    select id as id,type from MaTable where id not in (select max(id) as id from MaTable group by type))e
    group by e.type
    Si tu veux avoir les 5 derniers, ca devient plus delicats.
    Je passerai par du code externe pour ca !

    Bon Courage[/code]

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je préfère la solution suivante, très facile à adapter pour les n dernières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.Type, a.Valeur
    FROM laTable a INNER JOIN laTable b ON a.Type    = b.Type 
                                       AND a.Valeur <= b.Valeur
    GROUP BY a.Type, a.Valeur
    HAVING Count(*) <= 2;
    D'autre part, il n'est pas obligatoire d'utiliser une fonction d'agrégation dans un GROUP BY (mais cela risque de ne pas être très utile (similaire à DISTINCT))

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    J'ai testé cette requete sur une petite table, certe cela fonctionne parfaitement mais sur ma table de 83500 enregistrements, ça a l'air de prendre beaucoup trop de temps (je me suis arreté à 30 secondes)

    Néanmois j'utilise ma solution d'avant pour l'instant, un SELECT DISTINCT (ou un SELECT GROUP BY peut importe) et les resultats sont recupérés dans des SELECT [...] LIMIT 0,N
    Avec un INDEX sur le type, cela prend pas enormément de temps (entre 3 et 4 secondes avec 83500 enregistrements / 27 types)
    C'est une solution acceptable

    Merci à tous

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Debhian
    J'ai testé cette requete sur une petite table, certe cela fonctionne parfaitement mais sur ma table de 83500 enregistrements, ça a l'air de prendre beaucoup trop de temps (je me suis arreté à 30 secondes)
    Il faut un index sur (Type, Valeur) pour accélérer un peu

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

Discussions similaires

  1. select couple distinct
    Par gentelmand dans le forum SQL
    Réponses: 4
    Dernier message: 05/05/2010, 17h44
  2. requete Distinct couple
    Par taffMan dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/02/2008, 16h23
  3. [mysql]SELECTION couple distinct
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/10/2005, 09h32
  4. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 11h17
  5. equivalent SELECT DISTINCT pour MyBase?
    Par chrisou31 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 19h33

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