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

Sql sorusu


Pluton

Öne çıkan mesajlar

Selamlar, şimdi şu aşağı şekilde tablom var;


ID UserName Monster
Pluton MON_HDS
Di MON_ZEUS
Cihan MON_HERA
Gral MON_HDS
Paticik MON_ARES
Pluton MON_HDS
Pluton MON_ZEUS
Cihan MON_HERA



Şimdi mssql kullanıyorum ve olay kısaca şu şekilde. Her kişinin öldürdüğü toplam farklı yaratık sayısını bulmak istiyorum.

Yukarıdaki tabloya göre şu şekilde olması lazım;

UserName Monster Total
Pluton MON_HDS 2
Pluton MON_ZEUS 1

gibi. Group by ile falan baya denedim ama username ile mob sayılarını birleştirmeyi beceremedim. Ateistler bunuda açıklarsa sevinirim
Link to comment
Sosyal ağlarda paylaş

İlk verdiğin gayet hoş oldu. Şimdi her yaratığın bir puanı var. Öyle olduğu için yaratığın kaç tane kesildiğini bulmam gerek.

Birde şey sorsam. PHP ile yapılabilir ama belki sql'den halledebilirim.

Pluton Mob_HDS 2

Şimdi mesela Pluton 2 tane Mob_HDS öldürmüş. Buna göre kazandığı puan 60 olması lazım. Sql içinde if döngüsü ile falan sütun olarak yazdırabilir miyim bunu php ile hiç uğraşmasam
Link to comment
Sosyal ağlarda paylaş

Yaratığın vereceği puanı başka bir tablodan alıyorsun muhtemelen, onları da join etmen gerekir, o tablonun da yapısını verirsen bir örnek yazayım.

Şöyle olur hatta, tablo ve field isimlerini sen ihtiyacına göre düzeltirsin:

select t1.username, t1.monster, count(t1.*) * t2.puan from kills t1, monsters t2 where t1.monster=t2.monster
group by t1.username, t1.monster

Oracle için böyle, MySQL/MSSQL için syntax çok az değişiyor olabilir ama aynı heralde ya.
Link to comment
Sosyal ağlarda paylaş

Ya aslında başka tabloda tutmuyordum array olarak dosyada tutuyordum ama biranda mantıklı geldi farklı tabloda tutmak daha mantıklı geldi. 5-6 tane falan varda tablo açmak istememiştim.

Ama tutucaz mecburen teşekkürler BAggigo INNER JOIN olayını hallederim.
Link to comment
Sosyal ağlarda paylaş

Yalnız tavsiyem string match yaptırtma.
Yani monster'ların durduğu bir tablon olsun.
Monster'ların puan bilgileri ve id'leri olsun.

kills tablosunda ise user_id, monster_id bulunsun.
sen monster'ın adını öğrenmek istiyorsan, join edip bulursun zaten.

Öbür türlü transaction tablosu uzayınca bu eşleşmenin performansı düşer.
Link to comment
Sosyal ağlarda paylaş

Şimdi son birşey kaldı ve nasıl aratacağımı dahi bilemedim.

Şöyle bir tablom oldu;

Username , MonsterID , Point , TotalKill , TotalPoint
Pluton , 4 , 35 , 2 , 70
Pluton , 5 , 25 , 3 , 75
Pluton , 6 , 45 , 1 , 45

Tablo bu, benim yapmak istediğim olay bu 3 sütunu birleştirip şöyle birşey yapmak;

Username, TotalKill , TotalPoint
Pluton , 6 , 190

Bu şekilde satır birleştirip SUM() yapılabilir mi ?
Link to comment
Sosyal ağlarda paylaş


select Username, sum(TotalKill) , sum(TotalPoint)
from t1
group by username


Yalnız bu iş için ara tablo oluşturman gerekmez yani inner select'lerle tek seferde yapabilirsin.


select t1.username, t1.monsterid, t2.point, count(t1.*) totalkill, count(t1.*) * t2.point totalpoint from kills t1, monsters t2 where t1.monster=t2.monster
group by t1.username, t1.monster

Bu senin oluşturduğun ara tablonun sorgusu.


select s1.username, sum(s1.totalkill) totalkill, sum(s1.totalpoint) totalpoint from (
select t1.username, t1.monsterid, t2.point, count(t1.*) totalkill, count(t1.*) * t2.point totalpoint from kills t1, monsters t2 where t1.monster=t2.monster
group by t1.username, t1.monster ) s1
group by s1.username


Bir de bunu daha okunaklı yazabilirsin.


select s1.username
, sum(s1.totalkill) totalkill
, sum(s1.totalpoint) totalpoint
from (select t1.username
, t1.monsterid
, t2.point
, count(1) totalkill
, sum(t2.point) totalpoint
from kills t1
, monsters t2
where t1.monsterid=t2.monsterid
group by t1.username
, t1.monster ) s1
group by s1.username

böylece nereden ne geldiğini görmen kolaylaşır.

-------
Tüm bunların dışında tabloların id üzerinden ilerlemesi ve timestamp olması esastır. Bu kapsamda ben senin yerinde olsam tabloları aşağıdaki gibi yaratırdım.


create table kills (trx_id int, trx_date timestamp, user_id int, monster_id int);

create table monsters (monster_id int, monster_name varchar(100), monster_point int, trx_date timestamp);

create table users (user_id int, username varchar(100), trx_date timestamp);


Böylece user'larla ilgili tüm bilgileri users tablosunda tutarsın. Monster'larla ilgili tüm bilgileri de monsters tablosunda. Hatta bu tür işlerde genelde monster'larda versiyonlama oluyor. Yani monster_id'nin yanında bir de version_id oluyor. Böylece bir yaratığın puanı değiştiği zaman eski hesaplar şaşmaz. Eğer ilgileniyorsan açıklayayım ama çok da önemli değil diyorsan hiç kasmayayım, yeterince WoT oldu.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...