2012-11-27 50 views
3

我有如下表:MYSQL:数列,如果东西,如果另一列等于别的东西

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

我使用的PDO与方式的MySQL数据库。

感谢

+0

我知道答案的另一个问题 - 你不知道。需要使用PHP创建JS。 – Popnoodles

回答

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; 
+0

你喜欢'喜欢'但不喜欢......当它有必要吗? –

+3

@GrijeshChauhan,因为'LIKE'是[**保留字**](http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html)。 –

+0

明白了!我是MySQL的新手......即使我有一些没有答案的问题,并等待答案。 –

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

看来Kuya很快:) – bonCodigo

相关问题