Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Son kaydı almak [mssql]


Pluton

Öne çıkan mesajlar

Selamlar, şimdi öncelikle ID sütunu yok öyle olduğu içinde son kaydı nasıl alacağımı bilemedim.

Daha doğrusu yapmaya çalıştığım olay şu;

event tablosu var ve kişi oyuna girdiğinde;

CharID, EventID sütunlarına Karakter ID'sini ve 64 değerini giriyor. Çıktığında da 66 değerini INSERT ediyor. Ama dediğim gibi ID tablosu yok.

Benim istediğim her CharID'nin en son kaydını alıp 64 ise online yazdırıcam 66 ise offline yazdırıcam.

Yani mesela;
CharID - EventID
433 - 64
655 - 64
775 - 64
433 - 66

Olduğu varsayarsak 655 ve 775 numaralı karakterler online , 433 nolu karakter ise offline olmuş oluyor. Ama bunu sql'e dökemedim işte =)
Link to comment
Sosyal ağlarda paylaş

select charid from tablename
WHERE EXISTS
(select *
from tablename as in
where in.eventId = 64
and
in.charId = tablename.charId
)
and not exists
(select *
from tablename as out
where out.eventId = 66
and
in.charId = tablename.charId
)


daha zekicesi vardır çok uykumn geldi.
Link to comment
Sosyal ağlarda paylaş

Event'in gerçekleştiği timestamp de yok sanırım.

Öncelikle sistemi tasarlayan kimse söyle bu işi bıraksın.
----
Her ne kadar row_number()'la vs. taklalar atılarak yapılacağını düşünüyor olsan da, düşünme. Yapamazsın.
Çünkü farklı zamanlarda yolladığın select sorgularının dönüş sırası farklı olacaktır. Bunun bir kaçarı yok.

Tez tabloya en azından timestamp ekle ki, sıralayabil. Sıraladıktan sonra düzgün çalışabil.
----
Eğer çok takla atıcam diyorsan, şöyle bir iş yapabilirsin. Bir karaktere ait olan bütün kayıtları çekersin. Sonra PHP'de oturup işlersin. Bu şekilde bulursun, SQL'le yapabileceğin çok bir şey yok.
Link to comment
Sosyal ağlarda paylaş

Timestamp illaki eklenmeli.

Bunda hemfikir olduktan sonra şöyle çözebilirsin aslında :)
----
Her login'den sonra logoff olmak zorunda mı? Timeout'ta ne oluyor? Timeout zamanı da başka bir id ile bence kayıt girilmeli buraya. Yoksa takip edemezsin.

Herlesin önce online sonra offline olacağını düşünürsek şöyle bir iş yapabilirsin.

select charid, sum(case when eventid=64 then 1 when eventid=66 then -1 else 0 end) is_online
from event_table

Şöyle ki senin her login'in 1 her logoff'un -1 ise, kişi her login'den sonra logoff oluyorsa illaki, bu durumda bunların toplamı Offline'ken 0'dır. Online'ken 1.

Yalnız bunun işe yaraması için her login'den sonra logoff olmak zorunda. Timeout işleri bozar.
Link to comment
Sosyal ağlarda paylaş

Abi şimdi şöyle çokda yorgunum tam anlatamayabilirim affola.

Şimdi eleman diyelim oyuna giriş yaptı hop 64 INSERT ediliyor şu şekilde;

CharID , EventId , EventTime
433 , 64 , burada tarihi düşün işte
455 , 64 , tarih

--Bu tabloda 433 ve 455 online olmuş oluyor.

Bu şekilde sonrasında diyelim bu heriflerden birisi haritanın biyerinden biyerine ışınlandı şöyle oluyor;

CharID , EventId , EventTime
433 , 64 , burada tarihi düşün işte
455 , 64 , tarih
433 , 69 , tarih
433 , 69 , tarih

Burada yine 433 ve 455 online olmuş oluyor.

Yani her biryere teleport oldugunda 69 değerini veriyor. Timeout falan sallamıyor client ile bağlantı kopar kopmaz yapıştırıyor 66'yı. Yani şöyle;

CharID , EventId , EventTime
433 , 64 , burada tarihi düşün işte
455 , 64 , tarih
433 , 69 , tarih
433 , 69 , tarih
433 , 66 , tarih

Burada sadece 455 online olmuş oluyor.

Bununla uğraştım baya ama CharID'yi gruplayıp son işlemi 64 veya 69 ise online'dır ama 66 ise offlinedır olayını yapamadım.

Hatta şöyle birşey denedim;

SELECT
CharID,
CASE
WHEN MAX(EventID) = 64 THEN 'Online',
WHEN MAX(EventID) = 69 THEN 'Online',
WHEN MAX(EventID) = 66 THEN 'Offline',
FROM Events
WHERE EventID = 64 OR EventID = 66 OR EventID = 69
GROUP BY CharID
Link to comment
Sosyal ağlarda paylaş

Yapamazsın tabi 64, 66 ve 69'dan hangisi daha büyük? tabii ki 69. Her seferinde 69 döner.

Ya bir önceki mesajda dediğim gibi toplama işlemi yapacaksın, ki o çözüyor sorununu.

Ancak bu durumda ne yapılır diye başka okuyan arkadaşlar için da fikir olsun. timestamp ile eventid'yi concat'leyip max'ını alacaksınız. Yani

select charid, max(to_char(event_time,'YYYYMMDDHH24MISS') || eventid)
from event_table
group by charid

Böyle yaptığın zaman, önce zamana göre sıralar sonra eventid'ye göre. Böylece sen en son yapılan işlemin id'sini öğrenmiş olursun. Tabi bu Oracle'da böyle. Mssql'de nasıl yapılır biraz bakmam lazım. Kısacası timestamp'i YYYYMMDDHH24MISS formatına çevirip, eventid'yi concat edeceksin. Bunun max'ını alacaksın. Sonrasında elindekini mod 100 alırsan sana 64, 66, 69 neyse verir. Nihayetinde

select charid, case when mod(max(to_char(event_time,'YYYYMMDDHH24MISS') || eventid), 100) = 66 then 'Offline' else 'Online' end is_online
from event_table
group by charid

bu senin derdini çözüyor.

----
Yalnız dediğim gibi, bir önceki mesajdaki toplama işlemi de yine senin derdini çözerdi.
Link to comment
Sosyal ağlarda paylaş

Buldum mssql versiyonunu da. gidiş yolunu da gösterdim. en alttaki sorgu senin istediğin.

select charid, max(CONCAT(CONVERT(VARCHAR, event_time, 120), eventid)) last_event_date_and_id
group by charid

select charid, right(max(CONCAT(CONVERT(VARCHAR, event_time, 120), eventid)),2) last_event_id
group by charid

--Senin asıl istediğin bu aşağıdaki

select charid, case when right(max(CONCAT(CONVERT(VARCHAR, event_time, 120), eventid)),2) = 69 then 'Offline' else 'Online' end is_online
group by charid
Link to comment
Sosyal ağlarda paylaş

Abi işin açığı ben o toplama işini anlamamıştım üstünü körü okumuşum ama şimdi adam gibi okuyunca gayet mantıklı olduğunu anladım onun üzerinden gidicem. Araya 69 girince biraz karıştırdı ama uğraşayım biraz.

Şöyle birşey çıktı ortaya en sonda;

select distinct CharID,
SUM(case when EventID=64 OR EventID=69 then 1 when EventID=66 then -1 else 0 END) AS is_online
from _Events
GROUP BY CharID
Link to comment
Sosyal ağlarda paylaş

tam tersine bozmuşsun.
69'lar senin umrunda değil ki. Senin için pozitif olan tek değer 64, negatif olan tek değer 66.

Şöyle düşün. Adam online oldu 64. Işınlandı 69. Offline oldu 66. Senin yazdığına göre bunları toplayınca 1 + 1 + -1 = 1 çıkıyor. Yani adam online gözüküyor.

Olması gereken 64, 69, 66 diziliminde 1 + 0 + -1 = 0 olması. Yani Offline.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...