3 votes

MYSQL : compter une colonne si quelque chose si une autre colonne est égale à autre chose

J'ai le tableau suivant :

----------------------------------------------
|ID|Vote_Item_ID|User_ID|Country_code|   Vote|
|01|   105102151|user1  |          CA|   like|
|02|   105102151|user2  |          CA|dislike|
|03|   105102151|user3  |          UK|dislike|
|04|   105102151|user4  |          UK|   like|
|05|   105102151|user5  |          UK|   like|
----------------------------------------------

Ce que j'ai besoin de faire est de créer une instruction SQL qui crée un tableau qui totalise les goûts et les dégoûts pour chaque pays... Le script avec lequel j'utilise ceci a 175 pays, donc serait-ce une façon inefficace de le faire ?

Je ne sais pas comment écrire l'instruction Select, car je veux que le script soit réutilisable pour de nombreux "vote_item_id "s différents.

Au fait, j'utilise PDO avec une base de données MYSQL.

Merci

14voto

John Woo Points 132738
SELECT  Country_Code,
        SUM(CASE WHEN vote = 'like' THEN 1 ELSE 0 END) `like`,
        SUM(CASE WHEN vote = 'dislike' THEN 1 ELSE 0 END) dislike
FROM tableName
GROUP BY Country_Code

ou si vous voulez PreparedStatement ( les deux donnent les mêmes résultats )

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN vote = ''',
      Vote,
      ''' then 1 Else 0 end) AS `',
      Vote, '`'
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  Country_Code, ', @sql, ' 
                   FROM tableName
                   GROUP BY Country_Code');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

1voto

bonCodigo Points 8682

Si vous aviez montré le résultat attendu, cela aurait été formidable. L'échantillon suivant est simple. Faites-nous savoir ce dont vous avez vraiment besoin au-delà de ça. Nous serons heureux de vous aider :)

RÉFÉRENCE : SQLFIDDLE

CODE :

   SELECT t.country_code,
         sum(CASE WHEN t.vote = 'like' 
               THEN 1 ELSE 0 END) AS LIKES,
         sum(CASE WHEN t.vote = 'dislike' 
               THEN 1 ELSE 0 END) AS DISLIKE         
   FROM tbl t
   GROUP BY t.country_code
  ;

RÉSULTATS :

COUNTRY_CODE    LIKES   DISLIKE
CA                1     1
UK                2     1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X