4

私はMySQLが初めてです。

回答IDを持つテーブルがあります。回答は次のようになりa1, a2, a3 ...ますNULL:1 a

a1 a2 a3今、IDの数を明確に計算したいと思います。しかし、これを行うにはどうすればNULL、空白、ゴミなどを残すことができますか。

出力は次のようになります

atype count 
a1      45
a2       0
a3      56

特定の回答に対する行エントリがない場合、カウントは 0 になります。

4

3 に答える 3

3

解決策 1: 2 つのクエリ

希望する (正しい) 回答の種類を含む表を使用する必要があります。

| id | answer |
---------------
| 1  | a1     |
| 2  | a2     |
etc.

次に、テーブルに実際に存在する結果をカウントできます。

SELECT atype, COUNT( * ) cnt FROM answers JOIN mytable 
    ON mytable.atype=answers.answer GROUP BY answers.answer;

mytable(適切なテーブル名に置き換えます)。

もちろん、これは既存の結果のみを返します。ゼロ行を数えるには、表にない回答を探すことができます。

SELECT answer, '0' AS cnt FROM answers WHERE answer NOT IN(
    SELECT DISTINCT answer FROM answers JOIN mytable WHERE answer=mytable.atype );

ここに例があります。

解決策 2: カウンター テーブル

もう 1 つの方法は、カウンター テーブルを使用することです。

| id | answer | cnt |
---------------------
| 1  | a1     | 0   |
| 2  | a2     | 0   |
etc.

次に、結果をカウントするたびに、次のようにします。

UPDATE answers SET cnt=0;

UPDATE answers SET cnt=
    (SELECT cnt FROM 
        ((SELECT answers.answer, COUNT(*) AS cnt 
          FROM answers JOIN mytable ON answers.answer=myTable.aType 
          GROUP BY answers.answer) AS tbl) 
     WHERE answers.answer=tbl.answer) 
WHERE EXISTS 
    (SELECT cnt FROM 
        ((SELECT answers.answer, COUNT(*) AS cnt
          FROM answers JOIN mytable ON answers.answer=mytable.atype
          GROUP BY answers.answer) AS tbl) 
     WHERE answers.answer=tbl.answer);

これにより、回答テーブルのカウンター値が更新され、SELECT * FROM answers ORDER BY answer結果を取得できます。

ただし、注意してください: 2 番目のバージョンは便利ですが、すべてのサブクエリが必要になるため、最初のバージョンよりもはるかに多くの計算能力が必要になると思います。

これがこの例です(UPDATEステートメントは左側にあります!)

解決策 3: 書き込み時に更新する

私の意見では、あなたのようなユースケースに対するパフォーマンスを最も必要としない最善の解決策は、#2 で説明したようなカウンター テーブルを作成することですが、ユーザーが質問に答えているときにカウンター値を更新することです。カウントを知りたいときはいつでもすべてのエントリを計算します。

これは簡単に行うことができます。質問に正解するたびに、answers表のカウンターを増やします。

UPDATE answers SET cnt=cnt+1 WHERE answers.answer='a1';

繰り返しになりますが、クエリは次のようになります

SELECT * FROM answers ORDER BY answer;
于 2012-11-15T06:26:29.463 に答える
0
select a.atype,count(*) as `Count`
from
 (select 'a1' as atype union all
  select 'a2' as atype union all
  select 'a3' as atype )a
left join <your_table> b
on a.atype =b.atype
group by atype
于 2012-11-15T06:13:41.317 に答える
0

すべての主要な選択肢を提示しようとしました。各クエリの後にデモ リンクが続きます。リンクには説明が含まれています

select AType,count(*) as Count from tb2
where atype!='' and atype is not null and atype!='0' group by atype

Link1 (Best One) balank 0 と null 以外の各 (既存の) タイプの回答をカウントするには

select (select count(id) from tb2 where atype='a1') as A1,(select count(id) from
tb2 where atype='a2') as A2,(select count(id) from tb2 where atype='a3') as A3;

Link2(シンプルであなたに最も適しています)タイプa1、a2、またはa3のみの回答をカウントします(link3と同様の結果を得るための私の古い方法)

select AType,count(*) as Count from tb2
where atype in('a1','a2','a3') group by atype

Link3 は、タイプ a1、a2、または a3 の回答のみをカウントします。

最初と最後のリンクは、データにまったく存在しないタイプを考慮していません。たとえば、タイプ a2 の回答がない場合、1 番目と 3 番目のクエリはタイプ a1 と a3 の回答の数のみを示し、atype=a2 の回答は言及しません。ただし、2番目のクエリはそうです。

于 2012-11-15T07:43:58.643 に答える