Заявка и сортиране.

sentenello

Registered
Дори не знам какво да е заглавието на темата тъй като не знам дали това което ще питаме възможно и как точно се прави.

като за начало ще кажа че имам 10 мача между различни отбори като имам полета: дата,домакин,гост,резултат и статус на мача.

Въпроса ми е как да направя да взема мачовете от днес които.. домакина е в серия от победи да кажем 3 от последните си 5 мача, а госта е в серия загуби пак 3 от последните му 5 мача примерно.
 
Ще опитам да задам по друг начин въпроса си, за да си помогна сам :)

да кажем че имам

арсенал - тотнъм 2:1
Мидълзбро - Арсенал 1:3
Юнайтед - Сити 0:0

Каква трябва да е заявката, за да ми изведе
Арсенал - 6 точки (2 победи)
Юнайтед - 1 точка
Сити - 1 точка
Мидълзбро - 0 точки
Тотнъм - 0 точки.


Като цяло трябва да взема всеки един мач поотделно и да трупам точки на отбора победил, и накрая да сортирам отборите по най-много спечелени точки, но идея си нямам как трябва да стане това.
 
Здравейте,
като цяло, отборът с няй-много точки, може да не е този, който е в 'серия'. Поне според мен.
Каква ти е структурата на таблиците ?
Примерно таблица отбори
[sql]
CREATE TABLE IF NOT EXISTS `team` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/sql]
Таблица срещи
[sql]
CREATE TABLE IF NOT EXISTS `match` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`guestTeamId` bigint(20) unsigned DEFAULT NULL,
`hostTeamId` bigint(20) unsigned DEFAULT NULL,
`hostTeamGoals` int(5) DEFAULT NULL,
`guestTeamGoals` int(5) DEFAULT NULL,
`date` datetime DEFAULT NULL,
UNIQUE KEY `id` (`id`),
KEY `guestTeamId` (`guestTeamId`),
KEY `hostTeamId` (`hostTeamId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
[/sql]

Класирането може да вземеш така
[sql]
SELECT team.name,
COALESCE(host.hostTeamGoals > host.guestTeamGoals,0) * 3 +
COALESCE(guest.guestTeamGoals > guest.hostTeamGoals,0)* 3 +
COALESCE(host.hostTeamGoals = host.guestTeamGoals OR guest.guestTeamGoals = guest.hostTeamGoals,0) * 1 AS points,
FROM team
LEFT JOIN `match` host ON host.hostTeamId = team.id
LEFT JOIN `match` guest ON guest.guestTeamId = team.id
GROUP BY (team.id)
[/sql]
Предстоящите мачове (подредени по брой побери на домакин, гост)
[sql]
SELECT host.name, guest.name, `date`, h.win, g.win FROM `match` m
INNER JOIN team host ON hostTeamId = host.id
INNER JOIN team guest ON guestTeamId = guest.id
LEFT JOIN (
SELECT SUM(COALESCE(host.hostTeamGoals > host.guestTeamGoals,0) +
COALESCE(guest.guestTeamGoals > guest.hostTeamGoals,0)) AS win, wteam.id
FROM team wteam
LEFT JOIN `match` host ON host.hostTeamId = wteam.id
LEFT JOIN `match` guest ON guest.guestTeamId = wteam.id
WHERE DATE(host.date) < '2015-07-08' AND date(guest.date) < '2015-07-08' GROUP BY (wteam.id) LIMIT 5
) h ON h.id = host.id
LEFT JOIN (
SELECT SUM(COALESCE(host.hostTeamGoals > host.guestTeamGoals,0) +
COALESCE(guest.guestTeamGoals > guest.hostTeamGoals,0)) AS win, wteam.id AS id
FROM team wteam
LEFT JOIN `match` host ON host.hostTeamId = wteam.id
LEFT JOIN `match` guest ON guest.guestTeamId = wteam.id
WHERE DATE(host.date) < '2015-07-08' AND date(guest.date) < '2015-07-08' GROUP BY (wteam.id) LIMIT 5
) g ON g.id = guest.id
WHERE date(`date`) = '2015-07-08'
ORDER BY h.win DESC, g.win DESC
[/sql]

Тези, които са в серия (малко модифициран вариант на горната заявка)

[sql]
SELECT host.name, guest.name, `date`, h.win, g.win FROM `match` m
INNER JOIN team host ON hostTeamId = host.id
INNER JOIN team guest ON guestTeamId = guest.id
LEFT JOIN (
SELECT SUM(COALESCE(host.hostTeamGoals > host.guestTeamGoals,0) +
COALESCE(guest.guestTeamGoals > guest.hostTeamGoals,0)) AS win, wteam.id
FROM team wteam
LEFT JOIN `match` host ON host.hostTeamId = wteam.id
LEFT JOIN `match` guest ON guest.guestTeamId = wteam.id
WHERE DATE(host.date) < '2015-07-08' AND date(guest.date) < '2015-07-08' GROUP BY (wteam.id) HAVING win >= 3 LIMIT 5
) h ON h.id = host.id
LEFT JOIN (
SELECT SUM(COALESCE(host.hostTeamGoals > host.guestTeamGoals,0) +
COALESCE(guest.guestTeamGoals > guest.hostTeamGoals,0)) AS win, wteam.id AS id
FROM team wteam
LEFT JOIN `match` host ON host.hostTeamId = wteam.id
LEFT JOIN `match` guest ON guest.guestTeamId = wteam.id
WHERE DATE(host.date) < '2015-07-08' AND date(guest.date) < '2015-07-08' GROUP BY (wteam.id) HAVING win >= 3 LIMIT 5
) g ON g.id = guest.id
WHERE date(`date`) = '2015-07-08'
ORDER BY h.win DESC, g.win DESC
[/sql]


Като цяло за да се опростят заявките трябва да се денормализира базата от данни. Не че сега е много нормализирана де ;)

100% има и по-прост вариант но за краткото време, което имах това можах да измисля.

Поздрави.
 
Мисля че схванах повечето от нещата които написа.. Тия дни ще има яко тестване.. Благодаря, дано успея да наглася нещата.
 
Защо не направиш една таблица с отборите, в която да имаш поле winningStreak, което при победа да увеличаваш с едно, а при загоба да нулираш?

След това всичко имаш само една заявка със SELECT и ORDER.

Няма нужда от заявки по-дълги от SQL със структурата на таблицата :D
 
Данните ми са структурирани така, защото така ги нагласих когато правих хмл фиида.
В една таблица имената на отборите, в друга са ми мачовете съответно с резултатите.

Варианта за които се сещам сега е , да направя друга таблица както казваш ти, и когато въвеждам резултатите съответно ако е Arsenal - United - 2:0 , да ъпдейтва в тази таблица полето winstreak с +1 а полето winstreak на United да го нулира.

Това за което се сещам е че мога да добавя в таблицата с имената на отборите полета winstreak,losestreak,drawstreak и при добавяне на резултат те да се ъпдейтват, но колко е удачно това, ако имам хиляда мача днес?
 
Здравейте,
- За определянето на "серия от победи да кажем 3 от последните си 5 мача", трябва фактор "време", който не може да се представи в една таблица.
- До колкото видях има значение дали отборът е домакин или гост.
- Подреждането зависи от последните победи на домакина и госта, не от общият брой победи на домакина и госта.

Не мога да кажа дали заданието е правилно, но ако трябва да се удовлетворяват всички зададени услиовия, заявката ще стане още по-сложна.

Решението с една таблица - възможно е да. но цялата логика ще отиде в пхп-то и като цяло няма да е по-лесно. Заявката ще стане малка за сметка на пхп-логиката.

Поздрави.
 
Съгласен съм с теб @imagination, просто търся оптималния вариант, и уикенда като ми остане време ще тествам кода който си дал по-горе.

П.С. Да не отварям нова тема. Както винаги се опитвам да направя живота си по-труден без да знам дали това което целя е по правилното.

Код:
$zaqvkaposlednimachove= mysql_query(
"SELECT * 
From `match`
Where hometeam='$_GET[otbordom]' AND `FTgd` IS NOT NULL 
OR hometeam ='$_GET[otborgost]'	 AND `FTgd` IS NOT NULL 
OR awayteam='$_GET[otbordom]' 	 AND `FTgd` IS NOT NULL 
OR awayteam='$_GET[otborgost]' 	 AND `FTgd` IS NOT NULL"
);
while($rowa = mysql_fetch_assoc($zaqvkaposlednimachove))
{
	echo" $rowa[hometeam] - $rowa[awayteam]||<BR><BR>";
	
	if ($rowa[hometeam]="$_GET[otbordom]" OR $rowa[awayteam]="$_GET[otbordom]"){
		echo"IMA $rowa[hometeam]  - $rowa[awayteam]<hr>";
	}else{echo"drugiq otbor";}	

}

Въпроса ми е.. удачно ли е да се мъча всичко да е в една заявка и после да се "if"-кам като идиот или да си направя 2 заявки, като на първата задам

Код:
Where hometeam='$_GET[otbordom]' AND `FTgd` IS NOT NULL 
OR awayteam='$_GET[otbordom]'	 AND `FTgd` IS NOT NULL
и си изведа последните мачове на домакина и после същата заявка по-надолу и да си изведа последните мачове на госта.

П.С. 2 .. това е малко темата :)
 
Аз съм привърженик на минимум заявки към базата. Но за това което питаш си има UNION, ако правилно съм разбрал въпроса. Може и да не съм, ще трябва да обясниш по-подробно.
Този стил на програмиране код не е добър:
Код:
Where hometeam='$_GET[otbordom]'
освен ако предварително не си се погрижил да почистищ масива GET от злонамерен код.
Генерално - ползвай PDO или друк обектно ориентирай слой, който позволява да биндваш параметри и да задаваш типове. Ше си спестиш главоболия.
 
С GET вземам имената на двата отбора, след това бъркам в таблицата със всички мачове и намирам последните 5 мача на единия отбор($_GET[otbordom]), и на другия ($_GET[otborgost])..

По-моята логика това става с
Код:
Where hometeam='$_GET[otbordom]' AND `FTgd` IS NOT NULL 
OR hometeam ='$_GET[otborgost]'    AND `FTgd` IS NOT NULL 
OR awayteam='$_GET[otbordom]'     AND `FTgd` IS NOT NULL 
OR awayteam='$_GET[otborgost]'     AND `FTgd` IS NOT NULL"

Като така намирам редовете в таблицата в които или в поле домакин има отбора или в поле гост, и също така FTgd не е нулл(значи мача е свършил).

След което в самия цикъл с IF проверявам реда който идва дали има $_GET[otbordom] и ако е така, го извеждам. (така си мисля че ще извадя мачовете за единия отбор и после по същия начин за другия).

П.С. Доста четива съм си набелязал за копуване, защото определено имам нужда да почета не само за защитите от атаки, но и терминологията която много ми куца.
 

Back
Горе