Pluton Mesaj tarihi: Ekim 18, 2012 Paylaş Mesaj tarihi: Ekim 18, 2012 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ş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 18, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 18, 2012 -- moved topic -- Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
fizban Mesaj tarihi: Ekim 18, 2012 Paylaş Mesaj tarihi: Ekim 18, 2012 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ş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
reyou Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 auto increment te isini gorur sanki Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 19, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 19, 2012 Yok abi 1 milyondan fazla girdi çıktı olayı var. Her siteye giren kullanıcıya onu filtrelersem php ile sıçarım. Mecburen tabloyu sıfırlayıp timestamp ekleyip tekrar başlattım yapacak birşey yok. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 19, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
Borastus Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 üstün körü baktım ama WHEN MAX(EventID) = 64 THEN 'Online', dersen sanki tabledanki en yuksek eventid degerine bakiyor onun 64 e esit mi degil mi diye kontrol ediyor sanki. senin her id icin en yuksek timestamp ı bulup onun idsine bakman gerek. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 19, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 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ş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 19, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 19, 2012 Aynen abi bu çok iyi oldu biraz pürüzler var ama çözülmeyecek şeyler değil. Tekrar bir sql sorumu daha cevapsız bırakmadığın ve büyük yardımların için tşk ettim. Dürüm ısmarlayım mı :D Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
riglous Mesaj tarihi: Ekim 19, 2012 Paylaş Mesaj tarihi: Ekim 19, 2012 roket adam stayla mı? yemeksepetinden ;) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Pluton Mesaj tarihi: Ekim 19, 2012 Konuyu açan Paylaş Mesaj tarihi: Ekim 19, 2012 haha aynen kapıda ödeme ama ben ısmarlıyorum ısrar edicem :D Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar