MYSQL:如果另一列等于其他内容,则为count列

时间:2012-11-27 15:36:04

标签: mysql sql

我有下表:

----------------------------------------------
|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|
----------------------------------------------

我需要做的是创建一个SQL语句,创建一个数组,总结每个国家的好恶......我使用的脚本有175个国家,所以这是一个低效的方法来解决它?

我不确定如何编写Select语句,因为我希望脚本可以重用于许多不同的“vote_item_id”

顺便说一句,我正在使用带有MYSQL数据库的PDO。

由于

2 个答案:

答案 0 :(得分:13)

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

或者如果你想要PreparedStatement两者都给出相同的结果

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;

答案 1 :(得分:1)

如果你已经展示了你的预期产量,那就太好了。 以下示例很简单。所以,让我们知道你真正需要的是什么。很乐意投入。:)

参考: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
  ;

结果:

COUNTRY_CODE    LIKES   DISLIKE
CA                1     1
UK                2     1