Здравейте,
като цяло, отборът с няй-много точки, може да не е този, който е в 'серия'. Поне според мен.
Каква ти е структурата на таблиците ?
Примерно таблица отбори
[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% има и по-прост вариант но за краткото време, което имах това можах да измисля.
Поздрави.