2

*実際の問題は投稿タイトルよりもかなり複雑です:S

私がテーブルを持っているとしましょう

ID | vote_id |  vote_type |  vote_user

1  ----  2  -----   up -------    Tom
2  ----  3  -----   up -------    John
3  ----  3  -----   down -----    Harry
4  ----  4  -----   up -------    Tom
5  ----  2  -----   down -----    John
6  ----  3  -----   down -----    Tom

だから私がやりたいのは

  1. 特定のvote_idでテーブルをクエリします
  2. 次に、1のクエリから投票した数と反対した数を数えます
  3. 次に、ジョンがそのvote_idに投票したかどうかも確認したいと思います。

そして、私のやり方はそうです。

$up=0;
$down=0;
$voted="no"; 
$r=mysql_query("SELECT*FROM table_name WHERE vote_id == 3");

 while($row=mysql_fetch_array($r){
   if($row["vote_type"]=="up"){ $up++;}else{$down++;}
   if($row["vote_user"=="John"){ $voted="yes";}
 }

しかし、WHILE LOOPを使用せずにこれを行う方法(同等のコード)はありますか?実際のテーブルは非常に大きくなる可能性があるため、whileループの実行は非常に網羅的である可能性があります:S

編集 単一のクエリで実行できますか?

4

3 に答える 3

1

2つの別々のクエリを使用します。

すべての投票を数える

    SELECT vote_type, COUNT(*) AS amount
    FROM table_name
    WHERE vote_id = 3
    GROUP BY vote_type

最大2行を返します。

vote_type | amount
----------+--------
up        | 1
down      | 2

ジョンが投票したかどうか調べてください:

    SELECT vote_type
    FROM table_name
    WHERE vote_id = 3
    AND vote_user = 'John'

updownまたはNULLジョンの投票方法に基づいて、のいずれかを含む行を返します。彼が一度しか投票できないと仮定すると...

にインデックスを追加すると、パフォーマンスが向上するvote_type可能性があることに注意してください。vote_user

于 2012-04-22T07:57:42.790 に答える
0

このクエリを実行して、特定のvote_idの投票数の表を表示できます。

select vote_type, COUNT(*) from votes where vote_id = 2 AND group by vote_type

別のクエリを実行して、ジョンがそのvote_idに投票したかどうかを確認します

select count(*) from votes where vote_id = 2 AND vote_user = 'John'
于 2012-04-22T07:55:55.740 に答える
0

単一のクエリで

Select
  sum(case when vote_type = 'up' then 1 else 0 end) as up,
  sum(case when vote_type = 'down' then 1 else 0 end) as down,
  sum(case when vote_user = 'john' then 1 else 0 end) as john
from
  yourTable
where
  vote_id = 3

またはsumのバリエーション(ケースの場合)

于 2012-04-22T08:11:37.263 に答える