nasıl bir mysql toplamına dayalı satır rütbe öğrenmek için?

2 Cevap php

Ben bir satır sıralaması / numarasını bulmak isteyen. Ben deneyeceğim yüzden bu kuyu açıklayan kulüpler emin değilim.

Ben sorgu var

$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 />';

}

Şimdi geçmesi ve her sayı '1 olmanın en büyük 'toplam' dayalı bir sıralama vermek istiyorum.

Bu yüzden bazı sayma yaparak php ile yapabilirsiniz:

$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;

}

Bu iyi ve çalışıyor. Ama ne yapmak isteyen kulüpler, ben satış tablosundan bir ortaklık kimliği diyelim dayalı bir sql sorgusu yapmak, böylece php olmadan bir satır sıralamasını belirlemek mümkün değildir.

Yani, örneğin ben her satır bağlantılı bir ortaklık kimliği, nasıl ben sadece büyük toplam ortaklık dayalı sıralamasını alma hakkında gitmek istiyorum ile satış verilerinin 100 satırlar var?

2 Cevap

Bunu yapmak için bir özyinelemeli değişkeni kullanın, gibi pek yapabilirsiniz:

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

Belirli bir bağlı kuruluş sıralamasını kapmak için yapmanız gerekir:

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

Eğer bir tablo her zaman tarama yapmak zorunda çünkü Şimdi, (nispeten) yavaş.

Eğer MySQL kullanarak olmasaydı, ben bir alt sorgu öneririm, ama büyük MySQL horrendously alt sorgular hale getirir. Bana oldukça yavaş olacak gibi görünüyor, ama ben benchmarked değil. Her neyse, bunu yapabilirsiniz:

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

DB Diğer uygulamaları row_number ve row_number_count vardır. Eğer MySQL kullanıyorsanız, ben bu walk-around bir göz atın öneririz