PDA

View Full Version : حل مشکل من در sql



$ M 3 H R D A D $
یک شنبه 03 آذر 1392, 11:09 صبح
سلام من دارم نتایج جدول بازی های والیبال و نمایش میدم و میخوام امتیاز ها و اینکه هر تیم چند تا ست برد چندتا باخت و الان چند امتیاز داره و کدوم تیم اول هست کدوم دوم و ... و نمایش بدم

جدول من از آخر اینه :
natayej_sets :
id
natayej_id
team1
team2

جدول natayej :
id
team1
team2
time
tedad_tamashagar

تو جدول natayej فقط مشخصات کلی بازی هست به همراه آیدی تیم های اول و دوم

teams_name و نام تیم ها توشه
id
name


رکورد اول جدول natayej اینه
id=70
team1=4
team2=3
tarikh=1392/08/12

حالا آیدی 4 یعنی تیم نوین کشاورز و آیدی 3 یعنی تیم پیکان تهران

حالا جدول natayej_sets اینه :
id,natayej_id,team1,team2
190,70,25,21
191,70,18,25
192,70,21,25
193,70,25,23
194,70,12,15

یعنی چی حالا ؟ یعنی نتیجه ست های بازی آیدی 70 یعنی تیم هایی که گفتم ایناست !
یعنی کلا این بازی 5 تا ست داشت ( بازی ها دیگه کم تر یا بیشترن شاید متغییر هست پس )

حالا از این 5 تا ست نتیجه چی شد ؟
1
2
2
1
2
یعنی تیم اول ست اول و برد
تیم دوم ست دوم
تیم دوم ست سوم
تیم اول ست چهارم
تیم دوم ست پنج
یعنی کلا نتیجه 3 بر 2 به نفع تیم تیم دوم هست

خوب برنده بازی ها اینجوری مشخص میشه
حالا هر تیم ممکنه تو چندتا بازی انجام داده باشه
میخوام بفهمم چندتا بازی کرده (1)
چندتا برده و چندتا باخته و چندتا مساوی کرده (2)
و بتونم به نسبت برده *3 امتیاز + تعداد مساوی *1 = امتیازی که آورده

جدول هم زیر میزارم
select `natayej`.id as 'natijehid',`natayej`.team1 as 'natayejteam1',`natayej`.team2 as 'natayejteam2',`teams_name`.id as 'teamid',`teams_name`.name as 'teamname',`natayej_sets`.id as 'setid',`natayej_sets`.team1 as 'setteam1',`natayej_sets`.team2 as 'setteam2',`natayej_sets`.natayej_id as 'n2',sum(`natayej_sets`.team1),sum(`natayej_sets`. team2) FROM `teams_name` left JOIN `natayej` ON ( `teams_name`.id = `natayej`.team1 OR `teams_name`.id = `natayej`.team2 ) inner join `natayej_sets` on ( `natayej`.id = `natayej_sets`.natayej_id ) group by `natayej`.id,`natayej_sets`.natayej_id,`teams_name `.id order by `teams_name`.id


اینی که من زدم اشتباه چون مقدار گل ها و داره جمع میکنه و بزرگترس و میگیرم با php البته !

$ M 3 H R D A D $
یک شنبه 03 آذر 1392, 11:11 صبح
تا یه جاهایی یعنی همون if و else گذاشتم که مثلا برای همون آیدی 70 5 تا ردیف میاره که یا نوشته 1 یا 2
و میخوام بفهمم چطوری میشه فراوانی یک فیلد و بدست آورده ( مکس نه دوستان فراوانی )

$ M 3 H R D A D $
یک شنبه 03 آذر 1392, 11:17 صبح
SELECT CASE WHEN team1>team2 THEN 1 ELSE 2 END as state FROM `natayej_sets` WHERE 1

$ M 3 H R D A D $
یک شنبه 03 آذر 1392, 20:45 عصر
تا یه جاهایی یعنی همون if و else گذاشتم که مثلا برای همون آیدی 70 5 تا ردیف میاره که یا نوشته 1 یا 2
و میخوام بفهمم چطوری میشه فراوانی یک فیلد و بدست آورده ( مکس نه دوستان فراوانی )

shpegah
دوشنبه 04 آذر 1392, 08:20 صبح
دوست عزیز اگر اشکالی نداره جداولتونو تغییر دهید تا به راه حل بهتری برسید ولی باین حال جواب شما میشود:





select team,
sum(case when state=0 then cnt else 0 end) as E,
sum(case when state=1 then cnt else 0 end) as T,
sum(case when state=2 then cnt else 0 end) as F
from (
( SELECT 1,`natayej`.team1 AS team, state, count( state ) AS cnt
FROM
(SELECT natayej_id,
CASE WHEN team1 > team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state
FROM `natayej_sets` ) AS t1
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team1,state
)

UNION (

SELECT 2,`natayej`.team2, state, count( state ) AS cnt FROM ( SELECT natayej_id,

CASE WHEN team1 < team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state FROM `natayej_sets`

) AS t1 INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team2,state )
) as xxxx
group by team






حالا هرفرمولی دارید اعمال کنید فراوانی میشود امتیاز هر فرد تقسیم برتعداد اگر بازم مشکل داشتید اطلاع دهید

در ضمن تاریخ وتماشاچی باید در جدول دیگری باشد چون چند بازی از دوتیم یکسان در یک زمان ممکن نیست

$ M 3 H R D A D $
دوشنبه 04 آذر 1392, 11:19 صبح
برای جدولی که بهتون دادم میشه داده ها که کدتون میاره و توضیح بدید ؟
یک رکورد اول داده
13 7 0 0
یعنی چی ؟

shpegah
دوشنبه 04 آذر 1392, 14:47 عصر
برای جدولی که بهتون دادم میشه داده ها که کدتون میاره و توضیح بدید ؟
یک رکورد اول داده
13 7 0 0
یعنی چی ؟

یعنی تیم شماره 13 7تامساوی و0 تا برد 0 تا باخت داشته

البته حق باشماست دواشتباه در کد داشتم که درست کردم نتیجه میشه
تیم مساوی برد باخت
13 4 7 1

$ M 3 H R D A D $
دوشنبه 04 آذر 1392, 16:16 عصر
خوب شما تیم با آیدی 2 که کاله مازندران هست و نگاه کنید
نمیخوام تعداد ست ها نمایش داده بشه
الان کاله مازندران 1 بازی بیشتر نکرده و اونو باخته
با نتیجه 3 به 2 بازی و واگذار کرده در همون بازی
این کد ها تغییرات منه :
اما به جواب نرسیدم

select team,
sum(case when state=0 then cnt else 0 end) as E,
sum(case when state=1 then cnt else 0 end) as T,
sum(case when state=2 then cnt else 0 end) as F
from (
( SELECT `natayej`.team1 AS team, state, count( state ) AS cnt FROM (SELECT natayej_id,

CASE WHEN team1 > team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state FROM `natayej_sets`
) AS t1 INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY natayej_id,state )

UNION (

SELECT `natayej`.team2, state, count( state ) AS cnt FROM ( SELECT natayej_id,

CASE WHEN team1 < team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state FROM `natayej_sets` ) AS t1 INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY natayej_id,state )
) as xxxx
group by team ,natayej_id

$ M 3 H R D A D $
دوشنبه 04 آذر 1392, 16:18 عصر
مثال خخودتون یعنی تیم 13 یا هماتن باریج اسانس 3 تا بازی کرده
2تاشو بده و یکی مساوی
نتیجه شما کلا ست ها و دارهمیگه اما نتیجه کل مد نظر هست

$ M 3 H R D A D $
دوشنبه 04 آذر 1392, 16:21 عصر
به جای محاسبه برده باخته هر بازی کلا اگه بتونیم حساب کنیم که natayej_id=70 نتیجش شده 3 به 2 و بعد بتونیم بگیک 3 بزرگتر از 2 هست و چون 3 اولین عدد هست یعنی تیم اول برد و یدونه واحد به آیدی تیمش اضافه اگه باخت یدونه به باخت ها اضافه و اگه مساوی یدونه مساوی ها

تازه یجاهایی باید با جدول نام تیم ها left join کرد تا تیم هایی که بازی نکردند هم بیان تو نتیجه
یعنی بنویسه تعداد بازی 0 و و وو
البته از تعداد برد و باخت و مساوی میشه محاسبه کردت تعداد بازی و

shpegah
دوشنبه 04 آذر 1392, 21:19 عصر
نه دوست عزیز بازی کاله مازندران باپیکان تهران 5 بار در جدول ست تکرار شده دقت کنید

برای نام وبقیه قسمتها چون راحت بودبعهده خودتون گذاشتم ولی اگه میخاین اینو ببینید


select team,name,
sum(case when state=0 then cnt else 0 end) as E,
sum(case when state=1 then cnt else 0 end) as T,
sum(case when state=2 then cnt else 0 end) as F
from `teams_name` left join (
( SELECT 1,`natayej`.team1 AS team, state, count( state ) AS cnt
FROM
(SELECT natayej_id,
CASE WHEN team1 > team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state
FROM `natayej_sets` ) AS t1
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team1,state
)

UNION (

SELECT 2,`natayej`.team2, state, count( state ) AS cnt FROM ( SELECT natayej_id,

CASE WHEN team1 < team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE 2 END AS state FROM `natayej_sets`

) AS t1 INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team2,state )
) as xxxx
on ( `teams_name`.id=team)
group by team ,name

shpegah
دوشنبه 04 آذر 1392, 21:36 عصر
شما شاید اصلا منظورتون چیزدیگه است آره ؟
مگه جدول ست ایدی 79 که مربوط میشه به بازی کاله وتهران رو نمیگید ؟

shpegah
سه شنبه 05 آذر 1392, 07:45 صبح
ببخشید که من زیاد به نحوه امتیازدهی مسابقات وارد نیستم باتوجه به صحبتهای شما کدرو اینطور تغییر دادم


select *,(E+T+F) as TedadBazi,(E+3*T)/(E+T+F) as Emtiaz from(
select team,name,
sum(case when state=0 then cnt else 0 end) as E,
sum(case when state=1 then cnt else 0 end) as T,
sum(case when state=2 then cnt else 0 end) as F
from `teams_name` left join (
( SELECT 1,`natayej`.team1 AS team, state, count( state ) AS cnt
FROM
(select natayej_id,(case when sum(state)>0 then 1 when sum(state)=0 then 0 else 2 end) as state from
(SELECT natayej_id,
CASE WHEN team1 > team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE -1 END AS state
FROM `natayej_sets` ) AS t1
group by natayej_id ) as t2
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team1,state
)

UNION (

SELECT 2,`natayej`.team2, state, count( state ) AS cnt FROM
(select natayej_id,(case when sum(state)>0 then 1 when sum(state)=0 then 0 else 2 end) as state from
( SELECT natayej_id,

CASE WHEN team1 < team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE -1 END AS state FROM `natayej_sets`

) AS t1
group by natayej_id ) as t2
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team2,state )
) as xxxx
on ( `teams_name`.id=team)
group by team ,name) as x

$ M 3 H R D A D $
سه شنبه 05 آذر 1392, 14:08 عصر
ممنون فعلا مشکلم حل شده اما کارم کامل نشده
خیلی خوب کد ها و میتونید بنویسید و فک میکنم مفاهیم اصلی بهتون کمک میکنه ؟ مفهوم union و یا دسته بندی ها و غیره

الان مشتری زنگ زده که امتیاز ها و اشتباه حساب میکنه !!!!!!! کلی هم شاکی بوده !
انگار من از بچگی والیبالیست بودم
میگه برای بازی های با نتیجه 3 بر 2 برای تیم برنده و بازنده 2 امتیاز محسوب میشه
برای بازی ها با نتیجه 3 بر 0 یا 3 بر 1 : برای برنده 3 امتیاز و بازنده هیچی

کلا باید جدول های زیر و تولید کنم 2 تا جدول هستند

$ M 3 H R D A D $
سه شنبه 05 آذر 1392, 14:09 عصر
اینم لینکش :
http://iranvolleyball.com/sport/Schedule.aspx?TournamentIDGroup=75&TournamentID=37

http://www.iranvolleyball.com/Sport/livescorebox.aspx?TournamentID=37
http://www.iranvolleyball.com/sport/Results.aspx?TournamentIDGroup=75&TournamentID=37
http://iranvolleyball.com/sport/Rating4.aspx?TournamentIDGroup=75&TournamentID=37

shpegah
سه شنبه 05 آذر 1392, 21:18 عصر
select *,(E+T+F) as TedadBazi from(
select team,name,emtiaz,
sum(case when state=0 then cnt else 0 end) as E,
sum(case when state=1 then cnt else 0 end) as T,
sum(case when state=2 then cnt else 0 end) as F
from `teams_name` left join (
( SELECT 1,`natayej`.team1 AS team, state, count( state ) AS cnt,emtiaz
FROM
(select natayej_id,
(case when sum(state)>0 then 1 when sum(state)=0 then 0 else 2 end) as state,(case when sum(state)>=2 then 3
when sum(state)=1 then 2 when sum(state)=-1 then 1 else 0 end) as emtiaz from
(SELECT natayej_id,
CASE WHEN team1 > team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE -1 END AS state
FROM `natayej_sets` ) AS t1
group by natayej_id ) as t2
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team1,state,emtiaz
)

UNION (

SELECT 2,`natayej`.team2, state, count( state ) AS cnt,emtiaz FROM
(select natayej_id,(case when sum(state)>0 then 1 when sum(state)=0 then 0 else 2 end) as state,(case when sum(state)>=2 then 3
when sum(state)=1 then 2 when sum(state)=-1 then 1 else 0 end) as emtiaz from
( SELECT natayej_id,

CASE WHEN team1 < team2 THEN 1 WHEN team1 = team2 THEN 0 ELSE -1 END AS state FROM `natayej_sets`

) AS t1
group by natayej_id ) as t2
INNER JOIN natayej ON ( natayej_id = `natayej`.id ) GROUP BY team2,state,emtiaz )
) as xxxx
on ( `teams_name`.id=team)
group by `teams_name`.id,name
order by emtiaz desc) as x