2012-03-09 21 views
5

所以,我想我是在MySQL的获得很不错,直到我遇到了这个想法SELECT用户:谁已经downvoted,但从来没有upvoted

  • id:投票的唯一ID。
  • user:谁投
  • 的人的唯一的用户ID
  • item:项目的ID他们正在
  • vote投票:他们投SET( '向上', '向下')
投票

现在,我试图想出一种SQL方式来查找唯一投票声音低的用户。我知道有一种方法可以在查询表中的大部分数据之后用程序化方式编写它,但是当只有少数几个查询可以发现时,看起来确实非常低效。

理想情况下,我希望我的结果只是有0个upvotes的用户列表(因为在表中意味着他们已经投了票,所以他们只会downvote),也许他们投下的downvotes的数量。

任何想法,我应该如何处理这个?

+2

可能重复http://stackoverflow.com/questions/9626965/atleast-one-x-but-no- ys-query) – 2012-03-09 01:52:45

+0

哦,哇,非常相似,很好! – Tim 2012-03-09 02:01:14

+0

我对另一个问题留了言(我认为这个问题有一个很好的答案,并且有点早),它需要一个更好,更有利于搜索引擎优化的标题。我不知道这会是什么,本身,但我不认为* [至少有一个X,但没有Ys查询](http://stackoverflow.com/questions/9626965/at-least-one-x -but-no-ys-query)*足以描述它的含义。 – 2012-03-09 02:06:42

回答

5
SELECT user, SUM(IF(vote='down',1,0)) AS numDownVotes 
FROM votes 
GROUP BY user 
HAVING SUM(IF(vote='up',1,0))=0 -- 0 upvotes 
    AND SUM(IF(vote='down',1,0))>0 -- at least 1 downvotes 

我不禁感到有一个整洁的GROUP BY user, vote办法做到这一点虽然。

+0

输出正是我所期待的。 – Tim 2012-03-09 02:06:21

+0

这非常漂亮,解决了无法匹配'ALIAS'用于子查询的“WHERE”的“问题”。 – 2012-03-09 02:10:41

3
select user, count(user) 
from votes 
where user not in (
    select distinct user 
    from votes 
    where votes = 'up') 
+0

这可以计算每个用户给出的积分数量;但是如果用户同时投下了投票和最高投注,它仍然会包含他们(和他们的downvote总数)。 – 2012-03-09 01:42:35

+0

@ mathematical.coffee:你说得对。固定。 – Dinah 2012-03-09 01:52:51

+0

这很接近,但count(用户)给出了错误的值(在本例中为20而不是2)。 – Tim 2012-03-09 01:55:22

3

我没有检查语法什么的,但这想到......

SELECT user 
FROM votes 
GROUP BY user 
    HAVING SUM(IF(vote = 'up', 1, 0)) = 0 
    AND SUM(IF(vote = 'down', 1, 0)) > 0 
+0

这个样子非常有希望,但是有什么方法可以确切地确定每个用户投下多少次降价? – Tim 2012-03-09 01:57:27

+0

当然,你应该能够将SUM(IF(vote ='down',1,0))AS DownVotes添加到列规范中。 – Martin 2012-03-09 02:40:02

0

在数据库调用时出错了吗?喜欢的东西:

$query = "SELECT id FROM votes WHERE vote = 'down'"; 
$result = mysql_query($query); 
while ($rows = mysql_fetch_assoc($result)) 
{ 
$curID = $rows['id']; 
} 
+1

用户可以有多张选票(表中的多个条目)。这个查询为每个投票返回一个记录,而不是每个用户,并且它也会返回投票了_anything_的用户,即使他们投了其他东西。 – octern 2012-03-09 01:48:45

0
<?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 />"; 
} 
?> 
1
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; 
[ATLEAST一个X,但没有伊苏查询】(中
相关问题