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 SQL avec 2 count


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut Requête SQL avec 2 count
    Bonjour,

    Je cherche à parcourir une table et faire 2 count dans une autre le tout en 1 requête, exemple:



    Voici la structure des deux tables:
    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
     
    CREATE TABLE `terms` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `term` varchar(50) NOT NULL default '',
      `status` enum('0','1') NOT NULL default '0',
      PRIMARY KEY  (`id`),
      KEY `term` (`term`),
      KEY `status` (`status`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    CREATE TABLE `suggests` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `suggest` varchar(50) NOT NULL default '',
      `termid` smallint(6) unsigned NOT NULL default '0',
      `status` enum('0','1') NOT NULL default '0',
      PRIMARY KEY  (`id`),
      UNIQUE KEY `suggest` (`suggest`),
      KEY `termid` (`termid`),
      KEY `status` (`status`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    et la requête utilisée pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t.id, t.term, tmp_todo.nb_todo, tmp_done.nb_done
    	FROM terms t
    LEFT JOIN (SELECT s.termid, count(s.status) AS nb_todo FROM suggests s WHERE s.status = '0' GROUP BY s.termid) tmp_todo ON t.id = tmp_todo.termid
    LEFT JOIN (SELECT s.termid, count(s.status) AS nb_done FROM suggests s WHERE s.status = '1' GROUP BY s.termid) tmp_done ON t.id = tmp_done.termid
    	WHERE t.status = '0'
    GROUP BY t.id
    	ORDER BY t.term ASC
    LIMIT 10
    Quand j'utilise cette requête dans une boucle while, ceci boucle sur le premier résultat uniquement...

    Merci d'avance pour votre aide, cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select t.id, t.term, 
       count(*) - sum(s.status) as "SUGGEST / STATUS 0",
       sum(status) as "SUGGEST / STATUS 1"
    from terms t
    inner join suggest s on s.term_id = t.id
    where t.status = 0
    group by t.id, t.term

  3. #3
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Bonjour,

    merci pour votre aide.

    J'ai modifier la requête légèrement mais ne n'obtiens aucun résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.id, t.term, 
       count(*) - sum(s.status) AS "nb_todo / status 0",
       sum(s.status) AS "nb_done / status 1"
    FROM terms t
    	INNER JOIN suggests s ON s.termid = t.id
    WHERE t.status = 0
    	GROUP BY t.id, t.term
    ORDER BY t.term ASC LIMIT 10

  4. #4
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    voici ce que je te suggère :

    Code sql : 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
     
    SELECT Selection.Id,
           Selection.TERM,
           SUM(
           CASE
             WHEN Suggests.Status = 0 THEN
                 1
           END) AS Suggest_Status_0,
           SUM(
           CASE
             WHEN Suggests.Status = 1 THEN
                 1
           END) AS Suggest_Status_1
      FROM (SELECT Terms.Id,
                   Terms."TERM"
              FROM Terms
              WHERE Terms.Status = 0) AS Selection
        INNER JOIN Suggests ON (Suggests.Termid = Selection.Id)
      GROUP BY Selection.Id, Selection.TERM

  5. #5
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Bonjour,

    merci également pour votre aide.

    Votre requête proposé ne retourne aucun résultat non plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT selection.id,
           selection.term,
           SUM(CASE WHEN suggests.status = 0 THEN 1 END) AS suggest_status_0,
           SUM( CASE WHEN suggests.status = 1 THEN 1 END) AS suggest_status_1
    FROM (SELECT terms.id, terms.term FROM terms WHERE terms.status = 0) AS selection
    	INNER JOIN suggests ON (suggests.termid = selection.id)
    GROUP BY selection.id, selection.term
    ORDER BY selection.term ASC LIMIT 10

  6. #6
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    j'ai créé les tables et données, et le résultat de la requête est cohérent avec votre exemple.

    et sans le LIMIT ?

    Battu par punkoff (et qui fonctionne aussi chez moi) et qui est meilleur en terme d'optimisation

  7. #7
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Je vous assure que chez moi la requête suivante ne donne rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.id, t.term, 
       count(*) - sum(s.STATUS) AS "nb_todo / status 0",
       sum(s.STATUS) AS "nb_done / status 1"
    FROM terms t
    	INNER JOIN suggests s ON s.termid = t.id
    WHERE t.STATUS = 0
    	GROUP BY t.id, t.term
    ORDER BY t.term ASC
    Edit: voici mes deux tables chez moi
    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
    CREATE TABLE IF NOT EXISTS `suggests` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `suggest` varchar(50) NOT NULL default '',
      `termid` smallint(6) unsigned NOT NULL default '0',
      `status` enum('0','1') NOT NULL default '0',
      PRIMARY KEY  (`id`),
      UNIQUE KEY `suggest` (`suggest`),
      KEY `termid` (`termid`),
      KEY `status` (`status`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
    INSERT INTO `suggests` (`id`, `suggest`, `termid`, `status`) VALUES
    (1, 'bateau a', 2, '0'),
    (2, 'bateau a vendre', 2, '1'),
    (3, 'bateau amorceur', 2, '0'),
    (4, 'bateau a vapeur', 2, '1'),
    (5, 'maison algerie', 5, '0'),
    (6, 'bateau a voile', 2, '0'),
    (7, 'bateau a moteur', 2, '0'),
    (8, 'maison annecy', 5, '1'),
    (9, 'bateau antares', 2, '0'),
    (10, 'bateau arcachon', 2, '0');
     
     
    CREATE TABLE IF NOT EXISTS `terms` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `term` varchar(50) NOT NULL default '',
      `status` enum('0','1') NOT NULL default '0',
      PRIMARY KEY  (`id`),
      KEY `term` (`term`),
      KEY `status` (`status`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
     
     
    INSERT INTO `terms` (`id`, `term`, `status`) VALUES
    (2, 'bateau', '0'),
    (5, 'maison', '0');

  8. #8
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    trouve

    c'est la colonne status de la table SUGGESTS est un alphanumerique (j'ai mis un entier).

    Soit changer le type de colonnes en lui indiquant que ce sont des numériques [je ne connais pas MYSQL, mais j'imagine possible] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `status` enum(0,1) NOT NULL DEFAULT 0,
    Ou modifier ma requête pour changer les CASEs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(CASE WHEN suggests.STATUS = '0' THEN 1 END) AS suggest_status_0,

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

Discussions similaires

  1. Requête SQL avec COUNT
    Par Kreepz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/12/2014, 16h59
  2. Requête SQL avec Having Count
    Par illight dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/10/2013, 14h00
  3. [MySQL] Requête SQL avec un Count.
    Par Requiem11 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/05/2009, 11h01
  4. Problème de requête SQL avec DISTINCT et COUNT ?
    Par [ZiP] dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/01/2007, 17h11
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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