具有where条件的其他表的2 COUNT()的MySQL查询

具有where条件的其他表的2 COUNT()的MySQL查询,mysql,Mysql,我有一个名为“运动”的表格,其中包含运动列表,其他称为“季节”,其中包含特定运动的季节,以及包含特定运动和季节的比赛 我需要一个MySQL查询来打印运动列表,其中包含每个赛季和比赛的数量。我的表格结构: 体育 +--------------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default

我有一个名为“运动”的表格,其中包含运动列表,其他称为“季节”,其中包含特定运动的季节,以及包含特定运动和季节的比赛

我需要一个MySQL查询来打印运动列表,其中包含每个赛季和比赛的数量。我的表格结构:

体育

+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(45)      | NO   |     | NULL    |                |
| description        | varchar(128)     | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_sport           | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(32)      | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_season          | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(64)      | NO   |     | NULL    |                |
| description        | varchar(128)     | YES  |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
季节

+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(45)      | NO   |     | NULL    |                |
| description        | varchar(128)     | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_sport           | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(32)      | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_season          | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(64)      | NO   |     | NULL    |                |
| description        | varchar(128)     | YES  |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
比赛

+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(45)      | NO   |     | NULL    |                |
| description        | varchar(128)     | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_sport           | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(32)      | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_season          | int(10) unsigned | NO   | MUL | NULL    |                |
| name               | varchar(32)      | NO   |     | NULL    |                |
| slug               | varchar(64)      | NO   |     | NULL    |                |
| description        | varchar(128)     | YES  |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
我的查询结果需要包含:sports.*、total_seasons(其中seasons.id_sport=sports.id的季节之和)和total_competitions(其中competitions.id_seasons=seasons.id和seasons.id_sport=sports.id的竞争之和)


提前谢谢你

使用左连接而不是内连接

SELECT sports.*,
    COUNT(seasons.id) AS total_seasons,
    COUNT(competitions.id) AS total_competitions
    FROM sports, seasons, competitions
    WHERE sports.id=id_sport AND seasons.id=id_season
    GROUP BY sports.id
select
  sports.id,
  sports.name,
  sports.slug,
  sports.description,
  ifnull(count( distinct seasons.id ), 0) as DistinctSeasons,
  ifnull(count( distinct competitions.id ), 0) as TotalCompetitions
from 
  sports
  left join seasons on sports.id=seasons.id_sport
  left join competitions on seasons.id = competitions.id_season
group by
  sports.id;

使用左联接而不是内联接

select
  sports.id,
  sports.name,
  sports.slug,
  sports.description,
  ifnull(count( distinct seasons.id ), 0) as DistinctSeasons,
  ifnull(count( distinct competitions.id ), 0) as TotalCompetitions
from 
  sports
  left join seasons on sports.id=seasons.id_sport
  left join competitions on seasons.id = competitions.id_season
group by
  sports.id;

请确认一下。。。季节可以有多个运动同时重叠。。。对吗?@DRapp:每项运动都会创造季节。它们不是体育项目之间共享的。例如,2010-2011足球赛季的id=1和id_sport=1,2010-2011足球赛季的id=2和id_sport=2。非常感谢。请确认一下。。。季节可以有多个运动同时重叠。。。对吗?@DRapp:每项运动都会创造季节。它们不是体育项目之间共享的。例如,2010-2011足球赛季的id=1和id_sport=1,2010-2011足球赛季的id=2和id_sport=2。非常感谢。谢谢你,德拉普,但我不明白为什么如果一些运动项目没有赛季或比赛,我就没有结果。我怎样才能解决它?谢谢大家!@Isern Palaus,我按照@ajreal的建议将我的版本更改为left outer join,但他的版本还包括检查是否没有这样的匹配,以将计数包装在IFNULL()中。。。因此,如果没有这样的比赛,你会在结果集中得到一个零值,而不是空值。谢谢你,德拉普,但我不明白为什么如果一些体育项目没有赛季或比赛,我就没有结果了。我怎样才能解决它?谢谢大家!@Isern Palaus,我按照@ajreal的建议将我的版本更改为left outer join,但他的版本还包括检查是否没有这样的匹配,以将计数包装在IFNULL()中。。。因此,如果没有这样的匹配,您将在结果集中得到一个零值,而不是NULL。谢谢您,Borelid,但我对DRapp的评论是一样的。如果某项运动没有比赛或赛季,我就得不到结果。我怎样才能解决它?非常感谢。谢谢你,博雷亚利德,但我还是对德拉普说了同样的话。如果某项运动没有比赛或赛季,我就得不到结果。我怎样才能解决它?非常感谢。这一切都很好,但当没有赛季比赛时,我的总成绩是1。如果没有季节,就不可能有比赛。我怎样才能修好它?提前谢谢你,它工作得很好,但只有这个细节!新年快乐@Isern Palaus-问题是使用星号造成的,更新版本应该会有帮助(或没有…)这一切都很好,但当没有比赛季节时,我得到TotalCompetitions为1。如果没有季节,就不可能有比赛。我怎样才能修好它?提前谢谢你,它工作得很好,但只有这个细节!新年快乐@Isern Palaus-问题是由使用星号引起的,更新版本应该有帮助(或者没有…)