Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL左连接和分组方式_Mysql_Join_Left Join - Fatal编程技术网

MySQL左连接和分组方式

MySQL左连接和分组方式,mysql,join,left-join,Mysql,Join,Left Join,我有两张桌子,一张是足球赛,一张是进球。我正在尝试用两个球之间的左路连接进行选择,计算主客场进球数。表格如下: CREATE TABLE `matches` ( `id` int(11) NOT NULL AUTO_INCREMENT, `home_team_id` int(11) NOT NULL, `away_team_id` int(11) NOT NULL ... CREATE TABLE `match_goals` ( `id` int(11)

我有两张桌子,一张是足球赛,一张是进球。我正在尝试用两个球之间的左路连接进行选择,计算主客场进球数。表格如下:

CREATE TABLE `matches` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `home_team_id` int(11) NOT NULL,
    `away_team_id` int(11) NOT NULL
    ...

CREATE TABLE `match_goals` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `match_id` int(11) NOT NULL,
    `team_id` int(11) NOT NULL,
    `minute` int(11) NOT NULL
    ...
SELECT * 
FROM 
    (SELECT id, home_team_id, away_team_id from matches) m, 
    (SELECT count(*) AS score, match_id, team_id from match_goals group by match_id, team_id) g 
WHERE m.home_team_id = g.team_id
ORDER by m.id
为了增加主队的所有目标,我想做如下事情:

CREATE TABLE `matches` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `home_team_id` int(11) NOT NULL,
    `away_team_id` int(11) NOT NULL
    ...

CREATE TABLE `match_goals` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `match_id` int(11) NOT NULL,
    `team_id` int(11) NOT NULL,
    `minute` int(11) NOT NULL
    ...
SELECT * 
FROM 
    (SELECT id, home_team_id, away_team_id from matches) m, 
    (SELECT count(*) AS score, match_id, team_id from match_goals group by match_id, team_id) g 
WHERE m.home_team_id = g.team_id
ORDER by m.id
这将带回一行团队的分数,可以是正整数或0(或null)

到目前为止,我还没有做到这一点——如果没有进球,就不会有争吵。我做错了什么?!非常感谢任何帮助(或其他问题的链接-我已经浏览了很多,但没有找到任何我能够适应的内容)

谢谢

托比

试试看

select m.id match_id, home_team_goal, away_team_goal
from matches m left join 
 ( select team_id, match_id, count(*) as home_team_goal
   from match_goals
   group by match_id,team_id
 ) hg on m.id=hg.match_id and m.home_team_id=hg.team_id
  left join 
 ( select team_id, match_id, count(*) as away_team_goal
   from match_goals
   group by match_id,team_id
 ) ag on m.id=ag.match_id and m.away_team_id=ag.team_id

如果我们看一下:

如果你想让主客场球队都得分,你需要做2次联合

对于只有主队得分的情况,您的查询将如下所示:

Select * 
FROM matches as m
LEFT JOIN ( 
   SELECT match_id, team_id, count(*) as count
     from match_goals
   GROUP BY match_id,team_id) as mg)

ON m.id = mg.match_id and m.home_team_id = mg.team_id

这对于相关子查询可能最容易,而不是显式的
左连接

select m.*,
       (select count(*)
        from match_goals mg
        where mg.match_id = m.id and mg.team_id = m.home_team_id
       ) as home_goals,
       (select count(*)
        from match_goals mg
        where mg.match_id = m.id and mg.team_id = m.away_team_id
       ) as away_goals
from matches m;

发布sqlfiddle和期望的结果我认为这正是我想要的,太简单了,太棒了,谢谢!!