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 :

Compter les lignes d'une colonne d'un tableau dont la valeur est unique


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Compter les lignes d'une colonne d'un tableau dont la valeur est unique
    Bonjour à tous

    J'ai une table: hhhh_affichejeux

    idaffichejeux idduproduit iddujeu
    1 1 101
    2 1 102
    3 1 103
    4 1 104
    5 2 102
    6 2 103
    7 2 110
    8 2 120
    9 3 101
    10 3 102
    11 3 103
    12 3 104
    13 4 101
    14 4 102
    15 4 150

    Résultat attendu: 3 (110, 120, 150)

    Je recherche la requête SQL pour compter les lignes d'une colonne "iddujeu" d'un tableau dont la valeur est unique.

    Voici la requête de base qui compte toutes les lignes du tableau "hhhh_affichejeux".
    J'ai essayer pas mal de chose mais je n'arrive pas au bon résultat. COUNT(DISTINCT ... GROUP BY...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $requete=$bdd->prepare("
    SELECT COUNT(*) AS _cr_
    FROM jjjjjjjj_bdd.hhhh_affichejeux AS _af_
     
    ");
    $requete->execute();
    $total_jeux_exc=$requete->fetchColumn();
    Pourriez vous m'aider s'il vous plaît ?
    En vous remerciant,
    Olivier

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Bonjour,

    Cette requête se fait en deux étapes (donc avec une sous-requête = table dérivée) :
    1. Identifier les iddujeu qui n’apparaissent qu'une seule fois dans la table
    2. Compter les lignes sélectionnées


    Une demande très similaire a été postée aujourd'hui ici
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut à tous.

    Citation Envoyé par Autobus77
    Pourriez vous m'aider s'il vous plaît ?
    Voici ce que je vous propose comme solution à votre demande :
    Code mysql : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    START TRANSACTION
    --------------
     
    --------------
    -- ======================
    --------------
     
    --------------
    -- Base de Données `base`
    --------------
     
    --------------
    -- ======================
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    -- ============
    --------------
     
    --------------
    -- Table `test`
    --------------
     
    --------------
    -- ============
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `idaffichejeux` integer unsigned NOT NULL auto_increment primary key,
      `idduproduit`   integer unsigned NOT NULL,
      `iddujeu`       integer unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    -- =====================
    --------------
     
    --------------
    -- Insertion dans `test`
    --------------
     
    --------------
    -- =====================
    --------------
     
    --------------
    insert into `test` (`idaffichejeux`,`idduproduit`,`iddujeu`) values
      (1,  1, 101),
      (2,  1, 102),
      (3,  1, 103),
      (4,  1, 104),
      (5,  2, 102),
      (6,  2, 103),
      (7,  2, 110),
      (8,  2, 120),
      (9,  3, 101),
      (10, 3, 102),
      (11, 3, 103),
      (12, 3, 104),
      (13, 4, 101),
      (14, 4, 102),
      (15, 4, 150)
    --------------
     
    --------------
    -- ================
    --------------
     
    --------------
    -- Vidage de `test`
    --------------
     
    --------------
    -- ================
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +---------------+-------------+---------+
    | idaffichejeux | idduproduit | iddujeu |
    +---------------+-------------+---------+
    |             1 |           1 |     101 |
    |             2 |           1 |     102 |
    |             3 |           1 |     103 |
    |             4 |           1 |     104 |
    |             5 |           2 |     102 |
    |             6 |           2 |     103 |
    |             7 |           2 |     110 |
    |             8 |           2 |     120 |
    |             9 |           3 |     101 |
    |            10 |           3 |     102 |
    |            11 |           3 |     103 |
    |            12 |           3 |     104 |
    |            13 |           4 |     101 |
    |            14 |           4 |     102 |
    |            15 |           4 |     150 |
    +---------------+-------------+---------+
    --------------
    -- =======
    --------------
     
    --------------
    -- Requête
    --------------
     
    --------------
    -- =======
    --------------
     
    --------------
    select count(`nbre`) as Qte,
           group_concat(`num`) as Liste
      from (    select   `iddujeu`        as num,
                         count(`iddujeu`) as nbre
                  from `test`
              group by `iddujeu`
                having `nbre` < 2
           ) as x
    --------------
     
    +-----+-------------+
    | Qte | Liste       |
    +-----+-------------+
    |   3 | 110,120,150 |
    +-----+-------------+
    --------------
    -- ===
    --------------
     
    --------------
    -- FIN
    --------------
     
    --------------
    -- ===
    --------------
     
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Bonsoir et merci à tous les deux.

    J'étais en train d'examiner la réponse d'al1_24 quand j'ai vu le post de Artemus24 et j'ai immédiatement essayé d'adapter à ma requête en rajoutant la condition WHERE pour adapter ma requête à tous les produits (idduproduit)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $requete=$bdd->prepare("
    SELECT COUNT(nbre) AS Qte, GROUP_CONCAT(num) AS Liste
    FROM
    (
    SELECT iddujeu AS num, COUNT(iddujeu) AS nbre
    FROM jjjjjjjj_bdd.hhhh_affichejeux
    WHERE idduproduit=1
    GROUP BY iddujeu
    HAVING nbre < 2
    ) AS x
    ");
    $requete->execute();
    $total_jeux_exc=$requete->fetchAll(PDO::FETCH_NUM);
    J'ai fait ceci en php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php foreach($total_jeux_exc as list($p1,$p2)){
    echo $p1;
    }?>
    Seulement le résultat attendu n'est pas bon car j'obtiens le nombre de jeux total pour le idduproduit=1

    Si j'enlève la condition WHERE j'obtiens le nombre 83 et c'est bien cela, la requête fonctionne.

    Merci beaucoup
    Olivier

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    J'ai adapté de façon à obtenir seulement le résultat 3 de l'exemple.

    En fin de compte cela revient à dire que je recherche l'inverse des doublons dans une colonne, les cellules aux valeurs exclusives.

    Requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $requete=$bdd->prepare("
    SELECT COUNT(nbre) AS Qte
    FROM
    (
    SELECT COUNT(iddujeu) AS nbre
    FROM jjjjjjjj_bdd.hhhh_affichejeux
    WHERE idduproduit=1
    GROUP BY iddujeu
    HAVING nbre < 2
    ) AS x
    ");
    $requete->execute();
    $total_jeux_exc=$requete->fetchColumn();
    PHP:
    En espérant votre aide,
    Olivier

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Bonjour,

    Cette requête se fait en deux étapes (donc avec une sous-requête = table dérivée) :
    1. Identifier les iddujeu qui n’apparaissent qu'une seule fois dans la table
    2. Compter les lignes sélectionnées
    C'est exactement cela, j'aurais pas mieux expliqué.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Solution trouvée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $requete=$bdd->prepare("
    SELECT ALL idduproduit, iddujeu
    FROM
    (
    SELECT ALL idduproduit, iddujeu
    FROM jjjjjjjj_bdd.hhhh_affichejeux
    GROUP BY iddujeu
    HAVING COUNT(iddujeu) < 2
    ) AS x
    WHERE idduproduit=$id_produits
    ");
    $requete->execute();
    $total_jeux_exc_t=$requete->fetchAll(PDO::FETCH_NUM);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $total_jeux_exc=count($total_jeux_exc_t);
    Merci à tous les deux

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Beaucoup plus simples avec l'abominable LIMIT spécifique à MySQmerde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*) OVER() AS N
    FROM   test
    GROUP  BY iddujeu
    HAVING COUNT(*) = 1
    LIMIT 1;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Je tiens à préciser que c'est à titre indicatif que je vous ai communiqué une solution possible de votre demande.
    On peut faire la même chose de différentes façons ayant des impacts sur les performances.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je tiens à préciser que c'est à titre indicatif que je vous ai communiqué une solution possible de votre demande.
    On peut faire la même chose de différentes façons ayant des impacts sur les performances.

    @+
    Merci beaucoup, j'ai pu finir mes 3 dernières requêtes après plusieurs mois de travail sur mon site alors t'imagines pas comment je suis content.

    Avec toute ma gratitude, je te souhaite une bonne soirée

  11. #11
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Beaucoup plus simples avec l'abominable LIMIT spécifique à MySQmerde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*) OVER() AS N
    FROM   test
    GROUP  BY iddujeu
    HAVING COUNT(*) = 1
    LIMIT 1;
    A +
    Bonsoir et merci beaucoup

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

Discussions similaires

  1. Mettre à jour les lignes d'une colonne dans dataTable
    Par Mikelester12 dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/07/2007, 08h31
  2. Réponses: 1
    Dernier message: 05/12/2006, 21h39
  3. Concaténer toutes les lignes d'une colonne
    Par metalcoyote dans le forum Oracle
    Réponses: 6
    Dernier message: 10/05/2006, 15h51
  4. Comment compter les doublons d'une colonne?
    Par Dnx dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/11/2005, 10h50
  5. Compter les lignes d une <TABLE>
    Par Invité(e) dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/01/2005, 14h43

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