mysql - 用于检索选票的 SQL 语法奇怪地遗漏了一些结果

标签 mysql sql select count

我尝试查看其他帖子来执行 Mysql 查询,我想我已经差不多完成了,但由于某种原因我遇到了错误。

我有这些 table :

POSTS [id_post (int) / activity (int) ]
VOTES [id_vote (int) / id_post (int) / user_id (int)]
ACTIVITIES [id_activity (int) / activity_name (varchar)]

事实上我有更多的表和字段,但这些是与我的问题相关的。我创建了一个投票系统,将用户投票添加到 VOTES 表中,引用正在投票的帖子和投票者的用户帐户。

因此投票表可能如下所示:

id_vote | id_post | user_id
   1        5         8
   2        6         8

每个帖子都属于一个事件。我想列出每项事件得票最多的帖子。

这就是我到目前为止的情况:

SELECT activities.id_activity, activities.activity_name, votes.id_post, votes.totalvotes AS allvotes
FROM ( SELECT votes.id_post, COUNT(*) as totalvotes
       FROM `votes`
       GROUP BY votes.id_post
     ) AS votes
JOIN posts ON posts.id_post = votes.id_post
JOIN activities ON posts.activity = activities.id_activity
GROUP BY activities.id_activity
HAVING allvotes = MAX(totalvotes)

这很有效,我检索了我想要的内容,除了如果同一事件中的 2 个帖子具有相同数量的票数,我不知道哪一个仅在对这些帖子进行分组后才出现,以及为什么它不是另一个。

id_activity | activity_name | id_post | allvotes
    5            eating          5         2
    3           sleeping         6         1

更重要的是,真正困扰我的是某些事件由于某种原因不会显示。我注意到,在上面的例子中,如果属于饮食类别的帖子 5 确实是得票最多的帖子,那么就会出现该类别。但是如果碰巧得票最多的饮食类别帖子不是帖子 5(这是 MYSQL 决定默认显示的帖子),则有关饮食类别的整行根本不会显示.

我已经两天了…… 有什么想法吗?

非常感谢。

最佳答案

在单个查询中实现起来并不复杂。使用一些临时表会很容易。如果你想在单个查询中使用它,那么你可以尝试使用 row_number 。

示例:

SELECT id_activity,activity_name,id_post,v_count FROM(
SELECT id_activity,activity_name,id_post,v_count 
,@rownum := IF(@prev_value=id_activity,@rownum+1,1) AS RowNumber
,@prev_value := id_activity  
FROM (
select a.id_activity,a.activity_name,p.id_post,v.v_count
from activities a
left join posts p on p.activity=a.id_activity
left join (
  select id_post,count(*) v_count from votes v1
  group by id_post
) v on v.id_post=p.id_post
order by a.id_activity, v.v_count desc) as tmp
,(SELECT @rownum := 0) r
,(SELECT @prev_value := '') y
)tmp2
WHERE rownumber=1

FIDDLE

关于mysql - 用于检索选票的 SQL 语法奇怪地遗漏了一些结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483151/

相关文章:

mysql - MySQL中如何获取列的最大值

php - MySQL 语法区域和 2 个下拉菜单之间的验证

mysql - 使用 1930 列加载文件的更简单方法

Mysql:Order By 返回错误

sql - 在数据库中移动行 'up and down'(SQL查询帮助)

python - 在postgresql中插入一个数组

mysql - 如何选择混合字符串/整数列的最大值?

iphone - 尝试通过代码在我的 UISegmentController 中选择 segmentIndex

sql - 如何将2个临时表加在一起

javascript - 连接 2 个变量以形成一个新变量