*实际问题比帖子标题复杂得多: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
所以我想做的是
我的方式就是。
$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
编辑我可以使用单一查询吗?
答案 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投票的方式返回包含up
,down
或NULL
的行。假设他只能投票一次......
请注意,在vote_type
和vote_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
或总和的任何变化(个案时间)