我试图寻找其他帖子来执行Mysql查询,我想我快要出现了,但是由于某种原因我有一个错误。

我有那些表:

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

10-04 22:08
查看更多