【问题标题】:Check for a unique value within a count, but get all results检查计数中的唯一值,但获取所有结果
【发布时间】:2010-05-30 17:01:16
【问题描述】:

我正在尝试创建一个类似于堆栈溢出的单个查询,它会给我投票数,但还要确保当前正在查看的用户如果已经投票,则不能再次投票。

我的查询目前看起来像

SELECT cid, text, COUNT(votes.parentid) FROM cmets LEFT JOIN votes ON cmets.cid=votes.parentid AND votes.type=3 WHERE cmets.type=0 AND cmets.parentid='$commentParentid' GROUP BY cmets.cid

但我完全不知道如何添加检查以查看用户 ID 是否在投票表中。

另一种选择是添加一个单独的查询,其中

SELECT COUNT(*) FROM votes WHERE userid='$userid' AND parentid='$commentParentid' AND type=3

我只是意识到我对此非常迷茫,以至于我什至不知道要提供什么标签。

【问题讨论】:

    标签: mysql count


    【解决方案1】:
    SELECT cid, text, COUNT(votes.parentid), 
        COUNT(IF(votes.userid='$userid',1,NULL)) = 0 AS can_vote
    FROM comments 
    LEFT JOIN votes ON comments.cid=votes.parentid AND votes.type=3 
    WHERE comments.type=0 AND comments.parentid='$commentParentid' 
    GROUP BY comments.cid
    

    如果您坚持在 SQL 中这样做,这应该会根据用户对评论投票的次数为您提供一个标志 can_vote

    【讨论】:

    • 感谢 Iggy,效果非常好,并且为查询增加了很少的时间(到目前为止,在一个小数据集上)。出于好奇,您说“如果我坚持在 sql 中执行此操作”的方式,您会推荐另一种方式吗?
    • 你担心性能基本上是对的,一个复杂的查询可能需要比两三个独立的查询更长的时间,而且你的代码中有一些数字处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2013-12-31
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多