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 :

Comment récupérer un maximum de rows d'un certain type


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 77
    Points : 55
    Points
    55
    Par défaut Comment récupérer un maximum de rows d'un certain type
    Bonjour,

    Je cherche à écrire une requête me permettant de récupérer un certain nombre de lignes (en utilisant LIMIT) et je souhaiterais que le tableau de résultats retournés ne contienne qu'un nombre n d'enregistremments type via une colonne col.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table : tab1
    Colonnes : col1, col2, col3
     
    Récupérer 30 rows de tab1 order by col1, col2 et uniquement 3 lignes avec col3 = true
    Savez-vous comment faire ?

    Je précise que je suis sous PostgreSQL

    Merci à tous.

  2. #2
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

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

    Je ne suis pas sûr de bien comprendre le problème.
    Un petit exemple nous aiderait...

    ced

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 77
    Points : 55
    Points
    55
    Par défaut
    Et bien, imaginons la table "news" qui contient une colonne "type" et une colonne "name", je souhaiterais récupérer 30 news, order by "name" (et donc limit 30) mais je souhaiterais que dans ces 30 records il n'y en aie que maximum 3 de type = 1 (disons).

    Je ne vois pas trop comment limité mon résultat à un maximum de 3 news de type 1

    Je ne sais pas si je suis plus clair...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 77
    Points : 55
    Points
    55
    Par défaut
    Personne n'a une idée pour ce problème ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 982
    Points
    52 982
    Billets dans le blog
    6
    Par défaut
    Vosu ne pouvez pas faire cela avec des opérateurs anti relationnel comme LIMIT ou TOP qui sont spécifique à certains SGBDR et totalement anti ensembliste donc inadapté à l'écriture de requêtes censées...

    En revanche vous pouvez faire cela avec les fonctions de fenêtrage de la norme SQL:2003. Mais il ne sont pas implémentés sous MySQL... Très en retard par rapport à la norme SQL.

    Voici cepandant la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    CREATE TABLE T_LIGNES (COL1 INT, COL2 INT, COL3 INT)
     
    INSERT INTO T_LIGNES VALUES (1, 1, 1)
    INSERT INTO T_LIGNES VALUES (1, 2, 1)
    INSERT INTO T_LIGNES VALUES (1, 1, 2)
    INSERT INTO T_LIGNES VALUES (1, 3, 1)
    INSERT INTO T_LIGNES VALUES (1, 1, 3)
    INSERT INTO T_LIGNES VALUES (2, 1, 1)
    INSERT INTO T_LIGNES VALUES (2, 2, 1)
    INSERT INTO T_LIGNES VALUES (2, 1, 2)
    INSERT INTO T_LIGNES VALUES (2, 3, 1)
    INSERT INTO T_LIGNES VALUES (2, 1, 3)
    INSERT INTO T_LIGNES VALUES (3, 1, 1)
    INSERT INTO T_LIGNES VALUES (3, 2, 1)
    INSERT INTO T_LIGNES VALUES (3, 1, 2)
    INSERT INTO T_LIGNES VALUES (3, 3, 1)
    INSERT INTO T_LIGNES VALUES (3, 1, 3)
    INSERT INTO T_LIGNES VALUES (4, 1, 1)
    INSERT INTO T_LIGNES VALUES (4, 2, 1)
    INSERT INTO T_LIGNES VALUES (4, 1, 2)
    INSERT INTO T_LIGNES VALUES (4, 3, 1)
    INSERT INTO T_LIGNES VALUES (4, 1, 3)
    INSERT INTO T_LIGNES VALUES (5, 1, 1)
    INSERT INTO T_LIGNES VALUES (5, 2, 1)
    INSERT INTO T_LIGNES VALUES (1, 1, 2)
    INSERT INTO T_LIGNES VALUES (5, 3, 1)
    INSERT INTO T_LIGNES VALUES (5, 1, 3)
     
    -- selection de 10 lignes en order by col1, col2 dont 3 lignes avec col3 = 1
     
    -- 3 lignes avec col3 = 1
    SELECT COL1, COL2, COL3
    FROM   (SELECT *, ROW_NUMBER() OVER (ORDER BY col1, col2) AS N
            FROM   T_LIGNES
            WHERE  COL3 = 1) AS T
    WHERE  N <= 3
     
    UNION
     
    -- 7 lignes avec d'autres valeurs en ordre pour col1, col2 mais pas COL3 = 1
    SELECT COL1, COL2, COL3
    FROM   (SELECT *, ROW_NUMBER() OVER (ORDER BY col1, col2) AS N
            FROM   (SELECT * 
                    FROM T_LIGNES
                    EXCEPT
                    SELECT COL1, COL2, COL3
                    FROM   (SELECT *, ROW_NUMBER() OVER (ORDER BY col1, col2) AS N
                            FROM   T_LIGNES
                            WHERE  COL3 = 1) AS T
                    WHERE  N <= 3) AS T  
             WHERE  COL3 <> 1 ) AS TT
    WHERE  N <= 7
     
    COL1        COL2        COL3
    ----------- ----------- -----------
    1           1           1
    1           2           1
    1           3           1
    1           1           2
    1           1           3
    2           1           2
    2           1           3
    3           1           2
    3           1           3
    4           1           2
    J'ai limité à 10 lignes en tout au lieu de 30 et 3 lignes aev COL3 = 1 au lieu de COL3 = true.

    A +

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/05/2013, 09h48
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. Réponses: 2
    Dernier message: 08/12/2006, 11h09
  4. Comment récupérer le VK_TAB ?
    Par henderson dans le forum C++Builder
    Réponses: 5
    Dernier message: 11/12/2002, 11h32
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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