2009-09-02 17 views
0

私は違うアプローチを試みましたが、私の構文は大丈夫だと思ってもクエリは機能しません。MySQLの投票からの回答総数を数えて

私はかなり複雑な投票システムを持っています。一般的にポーリングにすべての答えは、「キー」欄には、特定の質問のID(「どのくらいの頻度でコーヒーを飲みます」のようにキーが「コーヒー」になります)、のようなものである一つのテーブル

CREATE TABLE `polls` (
    `poll_id` int(10) NOT NULL auto_increment, 
    `client_id` int(10) NOT NULL, 
    `key` varchar(20) NOT NULL, 
    `val` varchar(30) NOT NULL, 
    PRIMARY KEY (`poll_id`) 
); 

にパットされます値は質問によって異なります。時には0または1、場合によっては0〜6、時には文字列です。 統計的な目的のために、すべての質問に対するすべての回答の割合を表示したいと考えています。私はそのため、このクエリを使用します。

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(client_id) FROM clients) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val 

このクエリ内の問題は、私はユーザーの合計数を取得するために、クライアントテーブルに依存していることである - すべてのユーザーがすべての質問に答えたときに働きました。今度は投票にもう1つの質問を追加しました。どのユーザーがその質問に答えたのではなく、すべてのユーザーが回答したように割合がカウントされるため、クエリはどのように機能するのでしょうか。

私は、この(私はさまざまな方法を試してみましたが、のは、それに来たとしましょう)のようなものにクエリを変更してみました:

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(p2.poll_id) FROM polls AS p2 WHERE p2.`key` = p.`key`) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val 

私はそれを見る方法を - それは、メインクエリからすべての値を取得する必要があります、グループそれ、その後は、サブクエリを実行する - ので、私のようなものになるだろう:

coffee , 0 , 10 , 30 
coffee , 1 , 15 , 30 
coffee , 2 , 5 , 30 
tea , 0 , 5 , 25 
tea , 1 , 5 , 25 
tea , 3 , 5 , 25 
tea , 4 , 10 , 25 

最後の列は同じキーを持つすべての行をカウントし、コーヒーのために(valの列を無視するだろうが - > 10 + 15 + 5 = 30、紅茶 - > 5 + 5 + 5 + 10 = 25)。クエリは実行されません。それは実行されて実行されて実行され、最終的に私はそれをキャンセルする必要があります。私は "p2。key = p。key"サブクエリの一部に問題があると感じます。なぜなら、 "p2。key = 'coffee'"と書くと、クエリはチャームのように実行されるからです。

答えて

0

それは私の質問に、実際の答えではないのですが、何の答えはありませんので、 - 多分それはちょうど1つのクエリで私がやりたいことは不可能です。それはBY列と同じ与えられたグループとの値を合計し、グループ化された列= NULLとの合計数を追加します

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people 
FROM polls AS p GROUP BY p.`key`, p.val WITH ROLLUP 

:それは類似した何かをすることが可能です。私の問題の結果は次のようになります。

coffee , 0 , 10 
coffee , 1 , 15 
coffee , 2 , 5 
coffee , NULL , 30 
tea , 0 , 5 
tea , 1 , 5 
tea , 3 , 5 
tea , 4 , 10 
tea , NULL , 25 
NULL , NULL , 55 

私はそれがデータベースから取得したものと一致することが私のアプリの実装を変更することがありましたが、それは私のために動作します。

0

何を数えたいですか?合計でいくつの回答がありますか?それは同じくらい簡単です:

SELECT COUNT(*) `count` 
    FROM `polls` 

多分私はあなたが間違って理解...

+0

それは私が欲しいものではありません - 私は、同じキー値を持つ行の数を取得したい - このような何か: 'SELECT COUNT(poll_id)ポーリンググループからkey' BYトリックは、私はそれを取得したいされ1つのクエリで、「元の」クエリから既に取得したデータを使用します。 –