Как узнать ранг строки на основе суммы MySQL? - PullRequest
1 голос
/ 13 сентября 2009

Я хочу найти рейтинг / номер строки. Я не уверен, что я объясняю это хорошо, поэтому я попробую.

У меня есть запрос

$sql = 'SELECT SUM(amount) AS total FROM sales ORDER BY total DESC';

$res = mysql_query($sql);

while($row = mysql_fetch_array($res)) {

// go through and print each row biggest 'total' first
echo $row['total'] . '<br />';

}

Теперь я хочу пройти и дать каждому рейтинг, основанный на наибольшем «общем» числе «1».

Так что я могу сделать это с помощью php, выполнив некоторые подсчеты:

$sql = 'SELECT SUM(amount) AS total FROM sales ORDER BY total DESC';

$res = mysql_query($sql);

$rank = 1;

while($row = mysql_fetch_array($res)) {



// go through and print each row biggest 'total' first
echo 'rank: ' . $rank . ', ' . $row['total'] . '<br />';

$rank = $rank + 1;

}

Это хорошо и работает. Но я хочу определить ранжирование строки без php, чтобы я мог выполнить SQL-запрос на основе, скажем, идентификатора партнера из таблицы продаж.

Так, например, у меня есть 100 строк данных о продажах с привязанным к каждой строке идентификатором партнера, как бы я мог просто получить рейтинг по партнеру с наибольшим количеством?

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

Для этого вы можете использовать рекурсивную переменную, например:

select 
    @rownum:=@rownum+1 as rank,
    sum(amount) as total
from 
    sales,
    (select @rownum:=0) a
order by total desc

Чтобы получить рейтинг данного партнера, вам нужно сделать:

select
    a.*,
    t.rank,
    t.total
from
    affiliates a
    inner join (
        select 
            @rownum:=@rownum+1 as rank,
            affiliate_id,
            sum(amount) as total
        from 
            sales,
            (select @rownum:=0) r
        group by affiliate_id
        order by total desc) t on
       a.affiliate_id = t.affiliate_id
where
    a.affiliate_id = 342

Теперь это (относительно) медленно, потому что вам нужно каждый раз сканировать таблицу.

Если бы вы не использовали MySQL, я бы предложил подзапрос, но в целом MySQL ужасно оптимизирует подзапросы. Похоже, это будет довольно медленно для меня, но я не оценил это. В любом случае, вы можете сделать это:

select
    a.*,
    (select
        count(*)+1
    from
        (select affiliate_id from sales 
         group by affiliate_id having sum(amount) >
            (select sum(amount) from sales where affiliate_id = a.affiliate_id)))
        as rank
from
    affiliates a
where
    a.affiliate_id = 342
0 голосов
/ 13 сентября 2009

В других реализациях БД есть row_number и row_number_count. Если вы используете MySQL, я предлагаю вам взглянуть на этот обход

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...