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 の国があるため、これは非効率的な方法でしょうか?

スクリプトをさまざまな「vote_item_id」で再利用できるようにしたいので、Select ステートメントの書き方がわかりません。

ちなみに、MYSQLデータベースでPDOを使用しています。

ありがとう

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 に答える