2

私は PHP と MySQL が初めてで、これに苦労しています... PHP 挿入ページからフォーム データを収集しています。アンケート調査票です。問題は 20 問あり、答えはすべて 、 、 のいずれかに AなりBますC。このテーブルには、id 列と各質問の列があります ( Q1, Q2, Q3... Q20)。データは次のようになります。

+------+-----+
|  id  |  1  |
+------+-----+
|  Q1  |  A  |
|  Q2  |  B  |
|  Q3  |  A  |
|  .   |  .  |
|  .   |  .  |
|  .   |  .  |
|  Q20 |  C  |
+------+-----+

今、私がやろうとしているのは、 の値の数を数えA、単一の行に表示されることです (Bたとえば)。Cid=1

複数の列で値をカウントする方法はたくさん見つかりましたが、これまでのところ、単一の行で値をカウント/グループ化する方法は見つかりませんでした。

4

3 に答える 3

0

MySQLクエリでそれを行う方法は次のとおりです。

select id,
  sum(case when `1` = 'A' then 1 else 0 end) as CountA,
  sum(case when `1` = 'B' then 1 else 0 end) as CountB,
  sum(case when `1` = 'C' then 1 else 0 end) as CountC
from SurveyTable
group by id
order by id;

これは、限られたテスト データを使用したSQL Fiddleです。


補遺。カルロスは、次の回答につながる更新された構造を投稿しました。これらが近いことを願っています:)

これにより、総計を含む 1 つの非常に広い行が得られます。

select
  sum(case when Q1 = 'A' then 1 else 0 end) as Q1CountA,
  sum(case when Q1 = 'B' then 1 else 0 end) as Q1CountB,
  sum(case when Q1 = 'C' then 1 else 0 end) as Q1CountC,
  sum(case when Q2 = 'A' then 1 else 0 end) as Q2CountA,
  sum(case when Q2 = 'B' then 1 else 0 end) as Q2CountB,
  sum(case when Q2 = 'C' then 1 else 0 end) as Q2CountC,
  sum(case when Q3 = 'A' then 1 else 0 end) as Q3CountA,
  sum(case when Q3 = 'B' then 1 else 0 end) as Q3CountB,
  sum(case when Q3 = 'C' then 1 else 0 end) as Q3CountC,
  sum(case when Q4 = 'A' then 1 else 0 end) as Q4CountA,
  sum(case when Q4 = 'B' then 1 else 0 end) as Q4CountB,
  sum(case when Q4 = 'C' then 1 else 0 end) as Q4CountC,
  sum(case when Q5 = 'A' then 1 else 0 end) as Q5CountA,
  sum(case when Q5 = 'B' then 1 else 0 end) as Q5CountB,
  sum(case when Q5 = 'C' then 1 else 0 end) as Q5CountC
from SurveyTable;

質問ごとに1行を取得したい場合は、これを試してください:

select
  QuestionID,
  sum(case when Answer = 'A' then 1 else 0 end) as CountA,
  sum(case when Answer = 'B' then 1 else 0 end) as CountB,
  sum(case when Answer = 'C' then 1 else 0 end) as CountC
from (
    select 'Question1' as QuestionID, Q1 as Answer from surveytable
    union all select 'Question2', Q2 from surveytable
    union all select 'Question3', Q3 from surveytable
    union all select 'Question4', Q4 from surveytable
    union all select 'Question5', Q5 from surveytable) x
group by QuestionID

ここにフィドルがあります。


別の補遺: によって必要とされるカウント。行ごとにID1 つあるため、は必要ありません。IDSUM

これにより、アプローチが変わります。最初に答えをつなぎ合わせます。

concat(q1,q2,q3,q4,q5) -- result for ID=1 in the test data: 'ABCAC'

...次に、文字列からのすべての出現を吸い込みAます:

replace(concat(q1,q2,q3,q4,q5), 'A', '') -- result for ID=1: 'BCC'

... 最初の文字列 ( ABCAC) は長さ5、2 番目の文字列 ( BCC) は長さ 3 です。長さの違いは、A回答の数です: 2。私が説明できるのはこのくらいです。クエリは次のとおりです。

select
  id,
  5 - length(replace(concat(q1,q2,q3,q4,q5), 'A', '')) AS CountA,
  5 - length(replace(concat(q1,q2,q3,q4,q5), 'B', '')) AS CountB,
  5 - length(replace(concat(q1,q2,q3,q4,q5), 'C', '')) AS CountC
from surveytable;

更新された Fiddle はこちらです。

これにより、生データのみが得られます。書式設定は少しトリッキーですが、特にフロントエンド言語で行う場合は、それほど悪くはありません。これに MySQL を使用する必要がある場合は、上記をサブクエリに入れて、外側のクエリにフォーマットを適用する方がおそらく簡単です。

select
  id,
  CONCAT('You have chosen ' ...and miles of formatting logic using CountA, etc)
from (
  select
    id,
    5 - length(replace(concat(q1,q2,q3,q4,q5), 'A', '')) AS CountA,
    5 - length(replace(concat(q1,q2,q3,q4,q5), 'B', '')) AS CountB,
    5 - length(replace(concat(q1,q2,q3,q4,q5), 'C', '')) AS CountC
  from surveytable) x
于 2013-04-18T14:46:01.973 に答える
0

免責事項:メモリからなので、正確に機能しない場合があります。

これはどう?

SELECT 1 AS 1, (SELECT COUNT(1) FROM 質問 WHERE 1 = 'A') AS A, (SELECT COUNT(1) FROM 質問 WHERE 1 = 'B') AS B, (SELECT COUNT(1) FROM 質問 WHERE 1 = 'C') AS C

お役に立てれば。

于 2013-04-18T14:36:43.987 に答える