根据字段值计算num_rows

时间:2012-04-22 07:50:42

标签: php mysql

*实际问题比帖子标题复杂得多: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. 查询表格
  3. 然后计算投票中向上的投票次数以及从1中的查询投票向下的次数
  4. 然后我还要检查 John 是否投票支持该vote_id。
  5. 我的方式就是。

    $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 的情况下执行此操作,因为实际的表可以非常大,因此循环可以非常详尽:S

    编辑我可以使用单一查询吗?

3 个答案:

答案 0 :(得分:1)

使用两个单独的查询:

计算所有选票

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

最多会返回两行:

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

了解John是否投票

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

将根据John投票的方式返回包含updownNULL的行。假设他只能投票一次......

请注意,在vote_typevote_user上添加索引有助于提升效果。

答案 1 :(得分:0)

您可以运行此查询,为特定的vote_id提供上下表格。

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

我会运行另一个查询来检查John是否投票支持该投票结果

select count(*) from votes where vote_id = 2 AND vote_user = 'John'

答案 2 :(得分: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

或总和的任何变化(个案时间)