3

我有下表:

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

顺便说一句,我正在将 PDO 与 MYSQL 数据库一起使用。

谢谢

4

2 回答 2

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;
于 2012-11-27T15:38:16.613 回答
1

如果您显示了预期的输出,那就太好了。以下示例很简单。因此,让我们知道您真正需要什么。很乐意参​​与。:)

参考:SQLFIDDLE

代码:

   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
于 2012-11-27T16:01:53.480 回答