Php 选择已向下投票但从未向上投票的用户
所以,我一直认为我在MySQL方面做得很好,直到我有了这个想法: 我有一个表,记录了带有以下字段的得票,名称恰当: id:投票的唯一id。 用户:投票人的唯一用户ID item:他们正在投票的项目的ID 投票:他们投的票是“成立”和“否决” 现在,我正试图想出一种SQL方法来查找那些只投反对票的用户。我知道有一种方法可以在查询了表中的大部分数据后,用php程序化地编写它,但是当只有几个查询可以找到它时,这种方法似乎真的非常低效 理想情况下,我希望我的结果只是一个拥有0张赞成票的用户列表,因为在表中意味着他们已经投票,所以他们只投了反对票,也许还有他们投的反对票的数量Php 选择已向下投票但从未向上投票的用户,php,mysql,Php,Mysql,所以,我一直认为我在MySQL方面做得很好,直到我有了这个想法: 我有一个表,记录了带有以下字段的得票,名称恰当: id:投票的唯一id。 用户:投票人的唯一用户ID item:他们正在投票的项目的ID 投票:他们投的票是“成立”和“否决” 现在,我正试图想出一种SQL方法来查找那些只投反对票的用户。我知道有一种方法可以在查询了表中的大部分数据后,用php程序化地编写它,但是当只有几个查询可以找到它时,这种方法似乎真的非常低效 理想情况下,我希望我的结果只是一个拥有0张赞成票的用户列表,因为在表
关于如何处理这个问题有什么想法吗?我还没有检查语法或任何东西,但我想到了这个
select user, count(user)
from votes
where user not in (
select distinct user
from votes
where votes = 'up')
SELECT user
FROM votes
GROUP BY user
HAVING SUM(IF(vote = 'up', 1, 0)) = 0
AND SUM(IF(vote = 'down', 1, 0)) > 0
我忍不住觉得有一个整洁的用户组,但投票方式可以做到这一点。在数据库调用中这样做有什么不对吗?比如:
$query = "SELECT id FROM votes WHERE vote = 'down'";
$result = mysql_query($query);
while ($rows = mysql_fetch_assoc($result))
{
$curID = $rows['id'];
}
这计算每个用户给出的否决票数;但是,如果用户同时进行了向下投票和向上投票,则仍将包括它们和它们的向下投票总数。这很接近,但countuser在本例中给出了错误的值,即20而不是2。此外,它仅返回一个具有一个用户ID的一行数据有多个用户可以有多个投票,这意味着表中有多个条目。这个查询为每一次投票返回一条记录,而不是每个用户,并且它还将返回投票否决任何内容的用户,即使他们投票支持其他内容。可能是重复的哦,哇,这非常相似,很好!我在另一个问题上留下了一条评论,我认为这个问题有一个很好的答案,而且更早一点,它需要一个更好的、对SEO更友好的标题。我不知道这本身会是什么,但我认为不足以描述它的含义。这看起来很有希望,但有没有办法确定每个用户投了多少次反对票?当然,你应该能够添加SUMIFvote='down',1,0作为列规范的下票数。输出正是我想要的。这非常漂亮,并且解决了无法匹配子查询使用别名的位置的问题。
$query = "SELECT id FROM votes WHERE vote = 'down'";
$result = mysql_query($query);
while ($rows = mysql_fetch_assoc($result))
{
$curID = $rows['id'];
}
<?php
// Make a MySQL Connection
$query = "SELECT user, COUNT(user) FROM votes where vote == 'down' GROUP BY user";
$result = mysql_query($query) or die(mysql_error());
// Print out result
while($row = mysql_fetch_array($result)){
echo "User : ". $row['type'] ." has ". $row['COUNT(user)'] ." downvote/s.";
echo "<br />";
}
?>
select v.user from votes v where
0=(select count(a.vote) from votes a where a.user=v.user and a.vote='up' group by user) u
and
0 <(select count(a.vote) from votes a where a.user=v.user and a.vote='down' group by user) d
group by user;