【问题标题】:SELECT users who have downvoted but never upvoted选择已投反对票但从未投反对票的用户
【发布时间】:2012-03-09 01:33:25
【问题描述】:

所以,在我遇到这个想法之前,我认为我在 MySQL 方面做得很好:

我有一个记录“投票”(恰当地命名为votes)的表格,其中包含以下字段:

  • id:投票的唯一 ID。
  • user:投票者的唯一用户 ID
  • item:他们正在投票的项目的 ID
  • vote: 他们投的票 SET('up','down')

现在,我正在尝试提出一种 SQL 方法来查找唯一投反对票的用户。在从表中查询大部分数据后,我知道一种在 php 中以程序方式编写它的方法,但是当只有少数查询可以找到这一点时,这样做似乎真的非常低效。

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

关于我应该如何处理这个问题的任何想法?

【问题讨论】:

  • 哇哦,太像了,太好了!
  • 我对另一个问题发表了评论(我认为这个问题的答案很好,而且更早一些)它需要一个更好、更适合 SEO 的标题。我不知道这本身会是什么,但我认为 At least one X but no Ys Query 不足以描述它的含义。

标签: php mysql


【解决方案1】:
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 方法可以做到这一点。

【讨论】:

  • 输出正是我想要的。
  • 这很漂亮,并且解决了无法匹配 WHEREALIAS 用于子查询的“问题”。
【解决方案2】:

我没有检查语法或任何东西,但我想到了这个......

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

【讨论】:

  • 这看起来很有希望,但是有什么方法可以准确地确定每个用户投了多少反对票?
  • 当然,您应该能够将 SUM(IF(vote = 'down', 1, 0)) AS DownVotes 添加到列规范中。
【解决方案3】:
select user, count(user)
from votes
where user not in (
  select distinct user
  from votes
  where votes = 'up')

【讨论】:

  • 这会计算每个用户给出的反对票数;但如果用户同时投了反对票和反对票,它仍然会包括他们(以及他们的反对票总数)。
  • 这很接近,但 count(user) 给出了错误的值(在这种情况下,是 20 而不是 2。)
  • 另外,它只返回一个用户ID的一行(数据有多个)
【解决方案4】:
 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;

【讨论】:

    【解决方案5】:

    在数据库调用中这样做有什么问题吗?比如:

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

    【讨论】:

    • 一个用户可以有多个投票(表示表格中有多个条目)。此查询为每个投票返回一条记录,而不是每个用户,它还将返回投票anything的用户,即使他们投票支持其他事情。
    【解决方案6】:
    <?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 />";
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2018-07-08
      相关资源
      最近更新 更多