具有where条件的其他表的2 COUNT()的MySQL查询
我有一个名为“运动”的表格,其中包含运动列表,其他称为“季节”,其中包含特定运动的季节,以及包含特定运动和季节的比赛 我需要一个MySQL查询来打印运动列表,其中包含每个赛季和比赛的数量。我的表格结构: 体育具有where条件的其他表的2 COUNT()的MySQL查询,mysql,Mysql,我有一个名为“运动”的表格,其中包含运动列表,其他称为“季节”,其中包含特定运动的季节,以及包含特定运动和季节的比赛 我需要一个MySQL查询来打印运动列表,其中包含每个赛季和比赛的数量。我的表格结构: 体育 +--------------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default
+--------------------+------------------+------+-----+---------+----------------+
| 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-问题是由使用星号引起的,更新版本应该有帮助(或者没有…)