mysql - JOIN 语句中的 SQL 问题

标签 mysql sql join left-join

我有这 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/

相关文章:

mysql - 从多个表中检索记录,有些是不同的,有些不是

java - 如何在 Spring JPA for MySQL 中为 @Id @GeneratedValue 设置初始值?

sql - 带有 nativeQuery 的 Spring Boot Query 注释在 Postgresql 中不起作用

mysql - 从故事中选择项目,其中 story.uid 等于 uid 或 story.uid 等于 friend.uid 或 friend.fid 并被接受

php - 将 mySQL 中的阿拉伯语/日语转换为 php?

mysql - 什么时候使用 utf8mb4(bin、general_ci、unicode_520_ci)?

mysql - 如何排除 SQL 中的特定记录?

sql - 在sql server中将单条记录变成多条记录

php - 无法检索每条记录的额外查询的值?

mysql - 基础数据仓库 - 如何连接 2 个表之外的数据