我有这 4 个表:
CREATE TABLE IF NOT EXISTS `football_league` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`league` int(11) NOT NULL,
`country` int(11) NOT NULL,
`code` int(11) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
CREATE TABLE IF NOT EXISTS `football_goals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`match` int(11) NOT NULL,
`team` int(11) NOT NULL,
`goals` int(11) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `match` (`match`),
KEY `team` (`team`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
CREATE TABLE IF NOT EXISTS `football_matches` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pcode` varchar(32) NOT NULL,
`date` date NOT NULL,
`time` time NOT NULL,
`team_1` int(11) NOT NULL,
`team_2` int(11) NOT NULL,
`minutes` int(11) NOT NULL DEFAULT '0',
`status` varchar(16) NOT NULL,
`remarks` varchar(512) NOT NULL,
PRIMARY KEY (`id`),
KEY `pcode` (`pcode`),
KEY `team_1` (`team_1`),
KEY `team_2` (`team_2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
CREATE TABLE IF NOT EXISTS `football_teams` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pcode` varchar(32) NOT NULL,
`name` varchar(32) NOT NULL,
`shortname` varchar(32) DEFAULT NULL,
`played` int(11) NOT NULL,
`won` int(11) NOT NULL,
`draw` int(11) NOT NULL,
`lost` int(11) NOT NULL,
`points` int(11) NOT NULL,
`previous_results` varchar(16) NOT NULL,
`remarks` varchar(512) NOT NULL,
PRIMARY KEY (`id`),
KEY `pcode` (`pcode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
--
-- Constraints for table `football_goals`
--
ALTER TABLE `football_goals`
ADD CONSTRAINT `football_goals_ibfk_1` FOREIGN KEY (`match`) REFERENCES `football_matches` (`id`),
ADD CONSTRAINT `football_goals_ibfk_2` FOREIGN KEY (`team`) REFERENCES `football_teams` (`id`);
--
-- Constraints for table `football_matches`
--
ALTER TABLE `football_matches`
ADD CONSTRAINT `football_matches_ibfk_1` FOREIGN KEY (`pcode`) REFERENCES `football_league` (`code`),
ADD CONSTRAINT `football_matches_ibfk_2` FOREIGN KEY (`team_1`) REFERENCES `football_teams` (`id`),
ADD CONSTRAINT `football_matches_ibfk_3` FOREIGN KEY (`team_2`) REFERENCES `football_teams` (`id`);
--
-- Constraints for table `football_teams`
--
ALTER TABLE `football_teams`
ADD CONSTRAINT `football_teams_ibfk_1` FOREIGN KEY (`pcode`) REFERENCES `football_league` (`code`);
INSERT INTO `football_league` (`id`, `league`, `country`, `code`) VALUES
(1, 'International', 'International', 'L001'),
(2, 'English Premier League', 'English', 'L002'),
(3, 'Scottish Premier League', 'Scotland', 'L003');
INSERT INTO `football_matches` (`id`, `pcode`, `date`, `time`, `team_1`, `team_2`, `minutes`, `status`, `remarks`) VALUES
(1, 'L001', '2015-07-06', '18:45:00', 1, 2, 0, 'running', '18:00'),
(2, 'L002', '2015-07-02', '18:00:00', 7, 8, 0, 'FT', ''),
(3, 'L001', '2015-07-06', '18:45:00', 1, 2, 22, 'running', '');
INSERT INTO `football_teams` (`id`, `pcode`, `name`, `shortname`, `played`, `won`, `draw`, `lost`, `points`, `previous_results`, `remarks`) VALUES
(1, 'L002', 'Arsenal', 'arsenal', 50, 30, 10, 10, 70, 'WWLLD', ''),
(2, 'L002', 'Chelsea', 'chelsea', 50, 20, 10, 20, 50, 'LLWWW', ''),
(6, 'L002', 'Manchester City', 'manchester', 30, 20, 3, 7, 60, 'WWWWW', ''),
(7, 'L001', 'England', 'england', 50, 20, 13, 17, 53, 'WLWLL', ''),
(8, 'L001', 'Brazil', 'brazil', 30, 22, 2, 6, 46, 'WLLWW', ''),
(9, 'L001', 'France', 'france', 36, 18, 10, 8, 46, 'LLLWW', '');
INSERT INTO `football_goals` (`id`, `match`, `team`, `goals`, `time`) VALUES
(1, 1, 1, 1, '2015-07-06 14:36:00'),
(2, 1, 2, 1, '2015-07-06 12:28:00'),
(3, 2, 7, 1, '2015-07-06 14:39:00'),
(4, 2, 8, 1, '2015-07-06 12:28:00'),
(6, 1, 1, 1, '2015-07-06 08:33:00');
我想编写一个 SQL 语句,它将按特定联赛和日期显示所有比赛的比分。我尝试编写以下 SQL:
SELECT
football_league.code, football_matches.id,
football_league.league, football_league.country,
football_matches.date, football_matches.time as match_time,
football_matches.team_1, ft_1.name as name_a,
ft_1.shortname as short_a,
football_matches.team_2, ft_2.name as name_b,
ft_2.shortname as short_b,
football_matches.minutes, football_matches.status, football_matches.remarks,
sum(fg_1.goals) as score_a,
sum(fg_2.goals) as score_b
FROM football_matches
INNER JOIN football_teams as ft_1
ON ft_1.id = football_matches.team_1
INNER JOIN football_teams as ft_2
ON ft_2.id = football_matches.team_2
INNER JOIN football_league
ON football_league.code = football_matches.pcode
LEFT JOIN football_goals as fg_1
ON `fg_1`.`match` = football_matches.id AND `fg_1`.`team` = ft_1.id
LEFT JOIN football_goals as fg_2
ON `fg_2`.`match` = football_matches.id AND `fg_2`.`team` = ft_2.id
WHERE
football_league.code = 'L001'
AND
football_matches.date = '2015-07-06'
我的问题是:
i) 比分显示错误,应该是 2-1,而不是 2-2
ii) 第二个问题是我还需要显示其他比赛,没有球队进球,没有显示,我尝试使用 LEFT JOIN,但它仍然没有显示其他比赛。
最佳答案
尝试以下操作:
SELECT
football_league.code, football_matches.id,
football_league.league, football_league.country,
football_matches.date, football_matches.time as match_time,
football_matches.team_1, ft_1.name as name_a,
ft_1.shortname as short_a,
football_matches.team_2, ft_2.name as name_b,
ft_2.shortname as short_b,
football_matches.minutes, football_matches.status, football_matches.remarks,
(SELECT sum(goals) FROM football_goals WHERE `match` = football_matches.id AND `team` = ft_1.id) as 'score1',
(SELECT sum(goals) FROM football_goals WHERE `match` = football_matches.id AND `team` = ft_2.id) as 'score2'
FROM football_matches
INNER JOIN football_teams as ft_1
ON ft_1.id = football_matches.team_1
INNER JOIN football_teams as ft_2
ON ft_2.id = football_matches.team_2
INNER JOIN football_league
ON football_league.code = football_matches.pcode
LEFT JOIN football_goals as fg_1
ON `fg_1`.`match` = football_matches.id AND `fg_1`.`team` = ft_1.id
LEFT JOIN football_goals as fg_2
ON `fg_2`.`match` = football_matches.id AND `fg_2`.`team` = ft_2.id
WHERE
football_league.code = 'L001'
AND
football_matches.date = '2015-07-06'
GROUP BY football_matches.id
关于mysql - JOIN 语句中的 SQL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244025/