使用单个mysql查询确定排名

时间:2014-10-15 12:03:46

标签: mysql mysqli

我从我的桌子中选择一组项目并确定他们的排名以在我的页面上显示这个项目,我的代码用于选择项目:

`<?
$attra_query=mysqli_query($link, "select * from table WHERE category ='4'");
if(mysqli_num_rows($attra_query)>
0){
while($attra_data=mysqli_fetch_array($attra_query,1)){
?>`

在while循环中,我确定每个项目的排名,如下所示:

SELECT COUNT(mi.location) + 1 rank
     FROM table m
LEFT JOIN (
     SELECT id,location,country, ROUND(COALESCE(total_rating/total_rating_amount,0),10) rating_per_vote
       FROM table WHERE category = '4'
          ) mi
       ON mi.location = m.location
       AND mi.country = m.country

      AND mi.rating_per_vote > ROUND(COALESCE(m.total_rating/m.total_rating_amount,0),10)
    WHERE m.id = '$attra_id';

我认为这是非常低效的,有没有办法将2个查询合并为一个,所以我不必分别为每个项目运行排名查询?

// EDIT 样本数据:

id | location | country | category | total_rating | total_rating_amount 1 berlin DE 4 12 2
2 munich DE 4 9 1

投票系统为1-10分,因为样本数据berlin已获得12票,总票数为12票,munich已获得9票1票,所以{{1评级为6/10,berlin评级为9/10,因此应排名第1

2 个答案:

答案 0 :(得分:0)

在MySQL中,您可以使用变量进行排名。从你的查询中判断出你想要排名的内容有点难,但它会是这样的:

select t.*, (@rn := @rn + 1) as ranking
from table t cross join
     (select @rn := 0) vars
where category = '4'
order by rating_per_vote;

如果您提供样本数据和所需结果,则可以优化此解决方案。

答案 1 :(得分:0)

SELECT COUNT(m.id) rank, m.id
     FROM 
     (SELECT * FROM table WHERE category = '4') m
     LEFT JOIN (
     SELECT id,location,country, ROUND(COALESCE(total_rating/total_rating_amount,0),10) rating_per_vote
       FROM table WHERE category = '4'
          ) mi
       ON (mi.location = m.location
       AND mi.country = m.country
       AND mi.rating_per_vote > ROUND(COALESCE(m.total_rating/m.total_rating_amount,0),10))
       OR mi.id=m.id
GROUP BY m.id

我想这应该是。我不知道这是否是最佳解决方案。