Mysql 检索投票的SQL语法奇怪地遗漏了一些结果

Mysql 检索投票的SQL语法奇怪地遗漏了一些结果,mysql,sql,select,count,Mysql,Sql,Select,Count,我试着在其他帖子中做一个Mysql查询,我想我已经差不多做到了,但是由于某种原因我有一个bug 我有那些桌子: POSTS [id_post (int) / activity (int) ] VOTES [id_vote (int) / id_post (int) / user_id (int)] ACTIVITIES [id_activity (int) / activity_name (varchar)] 事实上,我有更多的表和字段,但这些是与我的问题相关的表和字段。我创建了一个投票系统,

我试着在其他帖子中做一个Mysql查询,我想我已经差不多做到了,但是由于某种原因我有一个bug

我有那些桌子:

POSTS [id_post (int) / activity (int) ]
VOTES [id_vote (int) / id_post (int) / user_id (int)]
ACTIVITIES [id_activity (int) / activity_name (varchar)]
事实上,我有更多的表和字段,但这些是与我的问题相关的表和字段。我创建了一个投票系统,将用户投票添加到投票表中,并引用正在投票的帖子和投票人的用户帐户

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

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)
这很好,我检索我想要的,除了如果同一活动中的两个帖子拥有相同数量的选票,我不知道哪一个帖子只在分组后出现,以及为什么它不是另一个

id_activity | activity_name | id_post | allvotes
    5            eating          5         2
    3           sleeping         6         1
更重要的是,真正困扰我的是,有些活动由于某种原因不会出现。我注意到,在上面的例子中,如果属于饮食类的帖子5确实是投票最多的,那么该类别就会出现。但是,如果碰巧拥有最多选票的饮食类帖子不是Post5(MYSQL决定默认显示的帖子),那么关于饮食类的整行帖子根本不会显示

已经两天了我在这。。。 有什么想法吗


非常感谢。

我想这是因为您按活动分组,我想知道为什么mysql中允许使用此语句,mssql中不允许仅按活动分组。id\u活动在这种情况下,您必须按活动和/或id\u帖子分组

试试这个:

SELECT activities.id_activity, activities.activity_name, votes.id_post, COUNT(*) as totalvotes
FROM votes
INNER JOIN posts ON posts.id_post = votes.id_post
INNER JOIN activities ON posts.activity = activities.id_activity
GROUP BY votes.id_post
HAVING totalvotes = MAX(totalvotes)
和lmk,如果有效:)

或修改您的声明:

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 votes.id_post
HAVING allvotes = MAX(totalvotes)

如果我没弄错的话,那是因为你有两篇文章有相同的活动,只要你把活动分组,而不是把文章分组,一篇文章就会消失

在单个查询中实现有点复杂。有了一些临时桌子就很容易了。如果您想在单个查询中使用它,那么可以尝试使用row\u 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

非常感谢您的快速回答,我非常感谢。我尝试了两种解决方案,但现在都不起作用。第一个猜测不返回结果,而第二个猜测返回许多结果,但许多行显示来自同一活动的帖子。如果我按活动编号分组,我的每个活动只显示一个帖子,尽管这不是一个好帖子。如果我按post\u id分组,我就得不到我需要的,如果我按活动分组,然后按id\u post分组,它仍然会显示同一类别中的许多行。我也试过像你建议的那样拥有一部分,它工作得很好,除了一些看起来不太好的活动,非常感谢。2天,你直接解决问题!你是老板!虽然我真的不明白你是怎么做到的(我不知道@ RoNUM语法和意思。有一个问题。SUNC,我在这个查询中看到6个选择,而你说另一个选择是使用一个临时表,你会推荐使用这个查询或临时表吗?我也不知道我怎么做这个,但是我可以考虑它是否更快?谢谢一堆: