如何在MySQL中仅一个查询中连接两个自定义查询和两个连接

时间:2015-03-04 09:34:41

标签: mysql sql select subquery left-join

查询分别完美地运行:

SELECT asf.surface_name, am.*
FROM atp_matchs_to_surfaces m2s
LEFT JOIN atp_surfaces asf ON m2s.surfaces_id = asf.surfaces_id
LEFT JOIN atp_matchs am ON am.matchs_id = m2s.matchs_id;

SELECT att.tournament_type_name, am.*
FROM atp_matchs_to_tournament_type m2s
LEFT JOIN atp_tournament_type att ON m2s.tournament_type_id = att.tournament_type_id
LEFT JOIN atp_matchs am ON am.matchs_id = m2s.matchs_id;

表'atp_matchs_to_surfaces'和'atp_matchs_to_tournament_type'以这种方式定义:

CREATE TABLE IF NOT EXISTS `atp_matchs_to_tournament_type` (
  `tournament_type_id` int(4) NOT NULL,
  `matchs_id` int(6) NOT NULL,
  PRIMARY KEY (`tournament_type_id`,`matchs_id`)

CREATE TABLE IF NOT EXISTS `atp_matchs_to_surfaces` (
  `surfaces_id` int(4) NOT NULL,
  `matchs_id` int(6) NOT NULL,
  PRIMARY KEY (`surfaces_id`,`matchs_id`)

其他表包含所有数据:

CREATE TABLE IF NOT EXISTS `atp_matchs` (
  `matchs_id` int(7) NOT NULL AUTO_INCREMENT,
  `tournament_name` varchar(36) NOT NULL,
  `tournament_year` year NOT NULL,-- DEFAULT '0000',
  `tournament_country` varchar(26) NOT NULL,
  `match_datetime` datetime NOT NULL,-- DEFAULT '0000-00-00 00:00:00',
  `match_link` varchar(85) NOT NULL,
  `prize_money` int(12) NOT NULL,
  `round` varchar(8) NOT NULL,-- DEFAULT '1R',
  `sets` varchar(34) NOT NULL,-- DEFAULT '0-0',
  `result` varchar(4) NOT NULL,-- DEFAULT '0-0',
  `p1_odd` decimal(4,2) NOT NULL,-- DEFAULT '0.00',
  `p2_odd` decimal(4,2) NOT NULL,-- DEFAULT '0.00',
  PRIMARY KEY (`matchs_id`)

CREATE TABLE IF NOT EXISTS `atp_surfaces` (
  `surfaces_id` int(4) NOT NULL AUTO_INCREMENT,
  `surface_name` varchar(24) NOT NULL,
  PRIMARY KEY (`surfaces_id`)

CREATE TABLE IF NOT EXISTS `atp_tournament_type` (
  `tournament_type_id` int(4) NOT NULL AUTO_INCREMENT,
  `tournament_type_name` varchar(22) NOT NULL,
  PRIMARY KEY (`tournament_type_id`)

我想在同一个Query中查找匹配和表面名称+锦标赛类型的所有记录。很明显?我希望......

我尝试使用SubQueries实现此功能:http://www.w3resource.com/mysql/subqueries/How can an SQL query return data from multiple tables,但我不能这样做。

3 个答案:

答案 0 :(得分:2)

好的,这是您当前的架构。如您所见,可以在多个表面上进行一场比赛,并且可以在多种锦标赛类型中进行一场比赛。

Your current schema

如果此架构没问题,您可以使用此查询获得结果:

SELECT am.*, asu.surface_name, att.tournament_type_name
FROM atp_matchs AS am
LEFT JOIN atp_matchs_to_surfaces AS m2s ON m2s.matchs_id = am.matchs_id
LEFT JOIN atp_surfaces AS asu ON asu.surfaces_id = m2s.surfaces_id
LEFT JOIN atp_matchs_to_tournament_type AS m2t ON m2t.matchs_id = am.matchs_id
LEFT JOIN atp_tournament_type AS att ON att.tournament_type_id = m2t.tournament_type_id

然而,如果一场比赛只能在一个赛道上进行,并且仅在一场锦标赛类型中,我会将您的架构更改为:

Suggested schema

删除了表atp_matchs_to_surfaces和atp_matchs_to_tournament_type,并将fields_id和tournament_type_id字段移至atp_matchs表。您的查询现在是:

SELECT am.*, asu.surface_name, att.tournament_type_name
FROM atp_matchs AS am
LEFT JOIN atp_surfaces AS asu ON asu.surfaces_id = am.surfaces_id
LEFT JOIN atp_tournament_type AS att ON att.tournament_type_id = am.tournament_type_id

答案 1 :(得分:0)

LEFT JOIN关键字返回左表(table1)中的所有行,右表(table2)中的匹配行。

SELECT asf.surface_name,am。* 从atp_matchs_to_surfaces m2s LEFT JOIN(选择att.tournament_type,am。* 从atp_matchs_to_tournament_type m2s)为......

答案 2 :(得分:0)

SELECT asf.surface_name, am.*
FROM atp_matchs_to_surfaces m2s
LEFT JOIN atp_surfaces asf ON m2s.surfaces_id = asf.surfaces_id
LEFT JOIN atp_matchs am ON am.matchs_id = m2s.matchs_id
LEFT JOIN(
SELECT att.tournament_type, am.*
FROM atp_matchs_to_tournament_type m2s
LEFT JOIN atp_tournament_type att AS Q1 ON m2s.surfaces_id = att.surfaces_id
LEFT JOIN atp_matchs am AS Q2 ON am.matchs_id = m2s.matchs_id);

我添加了一些" AS"因为我有错误:每个派生表必须有自己的别名。我在这里有点迷失了!