Əsas səhifə > MySQL > Getting rownum from subquery(emulating rownum)

Getting rownum from subquery(emulating rownum)

Oracle rownum-a oxşar bir sorğu yazmaq haqqında bir mövzu yazmışdım.
Lakin bu dəfə nəsə daha maraqlı bir problem yarandı.
Əvvəlki Mövzu

Qısa olaraq Turnir cədvəlində olan Komandaları xalı çox olandan yəni, liderdən aşağı olaraq sıralamaq lazımdır. Bununla yanaşı Hər komandanın tutduğu yeri də göstərmək lazımdır.
Komandaların ümumi xal hesabı aşağıdakı sorğu ilə tapılır:

 
select
  t.id,
  t.name,
  count(*) as total_matchs,
  sum(case when g.wins>0 then 1 else 0 end) as wins,
  sum(case when g.wins=0 then 1 else 0 end) as draw,
  sum(case when g.wins=0 then 1 else 0 end) as lost,
  sum(case sign(g.wins)
    when 1 then 3
    when 0 then 1
    else 0 end) as total_point,
  sum(g.GF) as GF,
  sum(g.GA)as GA,
  sum(g.GF)-sum(g.GA) as average
from
 (
  select 
    t.id, 
	l.match, 
	sum(case when t.id=l.team then 1 else -1 end) as wins,
	sum(case when t.id=l.team then 1 else 0 end) as GF,
	sum(case when t.id=l.team then 0 else 1 end) as GA
  from wd_teams t
  join wd_matches m on t.id in (m.home, m.away)
  join wd_timeline l on l.`match`=m.id and l.goal=1
  group by t.id, l.match
  )g
inner join wd_teams t on t.id=g.id
group by t.id, t.name
order by total_point desc,average  desc;

Nəticə:

İndi isə bizə lazımdır ki, hər komandanın neçənci yerdə olduğunu da göstərək.
Aşağıdakı üsuldan istifadə edirik:

 
set @row_num=0;

select
  @row_num:=@row_num+1 as rownum,
  t.id,
  t.name,
  count(*) as total_matchs,
  sum(case when g.wins>0 then 1 else 0 end) as wins,
  sum(case when g.wins=0 then 1 else 0 end) as draw,
  sum(case when g.wins=0 then 1 else 0 end) as lost,
  sum(case sign(g.wins)
    when 1 then 3
    when 0 then 1
    else 0 end) as total_point,
  sum(g.GF) as GF,
  sum(g.GA)as GA,
  sum(g.GF)-sum(g.GA) as average
from
 (
  select 
    t.id, 
	l.match, 
	sum(case when t.id=l.team then 1 else -1 end) as wins,
	sum(case when t.id=l.team then 1 else 0 end) as GF,
	sum(case when t.id=l.team then 0 else 1 end) as GA
  from wd_teams t
  join wd_matches m on t.id in (m.home, m.away)
  join wd_timeline l on l.`match`=m.id and l.goal=1
  group by t.id, l.match
  )g
inner join wd_teams t on t.id=g.id
group by t.id, t.name
order by total_point desc,average  desc;

Nəticə:

Səbəbi tam olaraq aydın olmadığından bu halın adını qoyuruq:
“unexpected” behaviour

Gördüyümüz kimi sıralama bizdə düzgün çıxmadı.
Həlli üçün isə aşağıdakı yoldan istifadə etmişəm. Böyük sorğunu from hissəyə əlavə edib, geri dönən nəticə əsasından row_num edirik:

 
select 
@row_num:=@row_num+1 as rownum,
zz.*
from (
select
  t.id,
  t.name,
  count(*) as total_matchs,
  sum(case when g.wins>0 then 1 else 0 end) as wins,
  sum(case when g.wins=0 then 1 else 0 end) as draw,
  sum(case when g.wins=0 then 1 else 0 end) as lost,
  sum(case sign(g.wins)
    when 1 then 3
    when 0 then 1
    else 0 end) as total_point,
  sum(g.GF) as GF,
  sum(g.GA)as GA,
  sum(g.GF)-sum(g.GA) as average
from
 (
  select 
    t.id, 
	l.match, 
	sum(case when t.id=l.team then 1 else -1 end) as wins,
	sum(case when t.id=l.team then 1 else 0 end) as GF,
	sum(case when t.id=l.team then 0 else 1 end) as GA
  from wd_teams t
  join wd_matches m on t.id in (m.home, m.away)
  join wd_timeline l on l.`match`=m.id and l.goal=1
  group by t.id, l.match
  )g
inner join wd_teams t on t.id=g.id
group by t.id, t.name) as zz
inner join
(select @row_num:=0) as r
order by zz.total_point desc,zz.average  desc

Nəticə:

Bu bizə lazım olan nəticədir.
Və bu sorğunu da from-a salmaqla biz daha da dəqiq olaraq istədiyimiz komandanın İD-sini verməklə o kamanda haqqında məlumatı onun turnir cədvəlində hazırkı tutduğu yeri öyrənə bilərik:

 
select
xx.*
from
(
select 
@row_num:=@row_num+1 as rownum,
zz.*
from (
select
  t.id,
  t.name,
  count(*) as total_matchs,
  sum(case when g.wins>0 then 1 else 0 end) as wins,
  sum(case when g.wins=0 then 1 else 0 end) as draw,
  sum(case when g.wins=0 then 1 else 0 end) as lost,
  sum(case sign(g.wins)
    when 1 then 3
    when 0 then 1
    else 0 end) as total_point,
  sum(g.GF) as GF,
  sum(g.GA)as GA,
  sum(g.GF)-sum(g.GA) as average
from
 (
  select 
    t.id, 
	l.match, 
	sum(case when t.id=l.team then 1 else -1 end) as wins,
	sum(case when t.id=l.team then 1 else 0 end) as GF,
	sum(case when t.id=l.team then 0 else 1 end) as GA
  from wd_teams t
  join wd_matches m on t.id in (m.home, m.away)
  join wd_timeline l on l.`match`=m.id and l.goal=1
  group by t.id, l.match
  )g
inner join wd_teams t on t.id=g.id
group by t.id, t.name) as zz
inner join
(select @row_num:=0) as r
order by zz.total_point desc,zz.average  desc) as xx
where xx.id=2;

Nəticə:

 
+--------+----+----------+--------------+------+------+------+-------------+------+------+---------+
| rownum | id | name     | total_matchs | wins | draw | lost | total_point | GF   | GA   | average |
+--------+----+----------+--------------+------+------+------+-------------+------+------+---------+
|      1 |  2 | Qarabağ  |            3 |    3 |    0 |    0 |           9 |    9 |    2 |       7 |
+--------+----+----------+--------------+------+------+------+-------------+------+------+---------+
1 row in set (0.01 sec)

Task completed😉

Kateqoriyalar: MySQL Etiketlər:
  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: