我有下表:
----------------------------------------------
|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。
由于
答案 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