Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
使用Union All和Join查询联盟表的Mysql_Mysql_Sql - Fatal编程技术网

使用Union All和Join查询联盟表的Mysql

使用Union All和Join查询联盟表的Mysql,mysql,sql,Mysql,Sql,对于足球联赛,我有两张表: teams是将所有团队列为唯一条目“id”的表, “团队名称” matches是在列中显示匹配结果的表 “主场”和“客场”我保存每场比赛的结果主队id’和 “客场团队id”是与团队表的关联。 我的查询是这样的: SELECT Teams, Sum(P) as 'Matches', Sum(W) as 'win', Sum(D) as 'draw', Sum(L) as 'lost', SUM(Pts) as 'points' FROM (

对于足球联赛,我有两张表:

teams是将所有团队列为唯一条目“id”的表, “团队名称” matches是在列中显示匹配结果的表 “主场”和“客场”我保存每场比赛的结果主队id’和 “客场团队id”是与团队表的关联。 我的查询是这样的:

SELECT Teams, Sum(P) as 'Matches', Sum(W) as 'win', Sum(D) as 'draw', Sum(L) as 'lost',
       SUM(Pts) as 'points'
  FROM (
        SELECT home Teams, 1 P,
                IF (home > away,1,0) W,
                IF (home = away,1,0) D,
                IF (home < away,1,0) L,
                CASE 
                    WHEN home > away THEN 3
                    WHEN home = away THEN 1 
                    ELSE 0
                END PTS
          FROM `matches`

        UNION ALL
        SELECT away Teams, 1,
                IF (home < away,1,0),
                IF (home = away,1,0),
                IF (home > away,1,0),
                CASE 
                    WHEN home < away THEN 3
                    WHEN home = away THEN 1
                    ELSE 0
                END
          FROM `matches`
        ) AS ERG
GROUP BY Teams
ORDER BY SUM(Pts) DESC 
就在最后的订单行之后。我收到一条错误消息。 我使用MySQL 5.1.44,所以嵌套选择应该不会有问题


有什么想法吗

听起来你想做这样的事情。我更新了您的子查询以包括主队和客队id,然后您将加入团队表以返回名称:

SELECT Teams, 
  Sum(P) as 'Matches',
  Sum(W) as 'win',
  Sum(D) as 'draw',
  Sum(L) as 'lost',
  SUM(Pts) as 'points',
  h.team_name as HomeTeam,
  a.team_name as AwayTeam
FROM
(
  SELECT home Teams,
    1 P,
    IF (home > away,1,0) W,
    IF (home = away,1,0) D,
    IF (home < away,1,0) L,
    CASE WHEN home > away THEN 3 WHEN home = away THEN 1 ELSE 0 END PTS,
    home_team_id,
    away_team_id
  FROM `matches`

  UNION ALL

  SELECT away Teams,
    1,
    IF (home < away,1,0),
    IF (home = away,1,0),
    IF (home > away,1,0),
    CASE WHEN home < away THEN 3 WHEN home = away THEN 1 ELSE 0 END,
    home_team_id,
    away_team_id
  FROM `matches`
) AS ERG
LEFT JOIN `teams` h
  on ERG.home_team_id = h.home_team_id
LEFT JOIN `teams` a
  on ERG.away_team_id = a.away_team_id
GROUP BY Teams, home_team_id, away_team_id
ORDER BY SUM(Pts) DESC 
根据您的评论编辑1,听起来您希望看到:


可以使用如下所示的外部联接:

SELECT a.team_name, Sum(ERG.P) as 'Matches', Sum(ERG.W) as 'win', Sum(ERG.D) as 'draw', Sum(ERG.L) as 'lost',
       SUM(Pts) as 'points'
  FROM 
    Teams a
    left outer join
    (
    SELECT home Teams, 1 P,
            IF (home > away,1,0) W,
            IF (home = away,1,0) D,
            IF (home < away,1,0) L,
            CASE 
                WHEN home > away THEN 3
                WHEN home = away THEN 1 
                ELSE 0
            END PTS
      FROM `matches`

    UNION ALL
    SELECT away Teams, 1,
            IF (home < away,1,0),
            IF (home = away,1,0),
            IF (home > away,1,0),
            CASE 
                WHEN home < away THEN 3
                WHEN home = away THEN 1
                ELSE 0
            END
      FROM `matches`
    ) AS ERG
    on a.team_name=ERG.Teams
GROUP BY a.team_name
ORDER BY SUM(Pts) DESC 
这对你很有好处


我还写了一篇相当长的文章,解释了联合、联合、外部联合和各种各样的其他好处——我在回答这样的问题时会链接到这些东西。它很长,很详细,并详细解释了所有步骤。

1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解要使用的正确语法,即在第20行的“从teams LEFT JOIN matches ON teams.id=”中选择team_name作为“Mannschaft”,当我尝试在OK中修改它时,看不到错误,这里没有数据,但我只是在检查错误。我在条款“非常感谢”中得到一个未知列“h.home\u team\u id”,但现在我在字段中得到:未知列“a.team\u name”list@flyte321在没有看到数据和/或完整的表结构的情况下,我根据您最初的问题进行猜测。在teams表中是否有一个名为team_name的字段?是的,我在teams中有两列:id和team_name该表非常简单,它看起来就像这样:id home_team_id home away_team_id away played在比赛时间更新时创建的比赛记录位置谢谢,但是这会导致在'field list'@flyte321中出现一个未知列'b.P'。对不起,我在写查询的上半部分时没有找到您的别名。希望编辑能起到作用。错误消失了,但现在出现了一个新错误:“on子句”@flyte321中的未知列“a.teams”。对不起,我猜的是列名,似乎您添加了语法和列名。在select、join和group by子句中将其更改为a.team_name有望实现这一目的。现在我再也不会收到错误了。但只有输出的第一行是正确的。看起来这个队的名字和赢-平-失1分相匹配。Superteam 2 0 0 0除“团队名称”列正确外,所有其他行都用零填充
SELECT TeamId, 
  t.team_name,
  Teams, 
  Sum(P) as 'Matches', 
  Sum(W) as 'win', 
  Sum(D) as 'draw', 
  Sum(L) as 'lost',
  SUM(Pts) as 'points'
FROM 
(
  SELECT home_team_id TeamId, 
      home Teams, 1 P,
      IF (home > away,1,0) W,
      IF (home = away,1,0) D,
      IF (home < away,1,0) L,
      CASE 
          WHEN home > away THEN 3
          WHEN home = away THEN 1 
          ELSE 0
      END PTS
  FROM `matches`

  UNION ALL
  SELECT away_team_id TeamId,
       away Teams, 1,
       IF (home < away,1,0),
       IF (home = away,1,0),
       IF (home > away,1,0),
       CASE 
           WHEN home < away THEN 3
           WHEN home = away THEN 1
           ELSE 0
        END
   FROM `matches`
) AS ERG
LEFT JOIN `teams` t
  ON ERG.TeamId = t.id
GROUP BY Teams, TeamId
ORDER BY SUM(Pts) DESC 
SELECT a.team_name, Sum(ERG.P) as 'Matches', Sum(ERG.W) as 'win', Sum(ERG.D) as 'draw', Sum(ERG.L) as 'lost',
       SUM(Pts) as 'points'
  FROM 
    Teams a
    left outer join
    (
    SELECT home Teams, 1 P,
            IF (home > away,1,0) W,
            IF (home = away,1,0) D,
            IF (home < away,1,0) L,
            CASE 
                WHEN home > away THEN 3
                WHEN home = away THEN 1 
                ELSE 0
            END PTS
      FROM `matches`

    UNION ALL
    SELECT away Teams, 1,
            IF (home < away,1,0),
            IF (home = away,1,0),
            IF (home > away,1,0),
            CASE 
                WHEN home < away THEN 3
                WHEN home = away THEN 1
                ELSE 0
            END
      FROM `matches`
    ) AS ERG
    on a.team_name=ERG.Teams
GROUP BY a.team_name
ORDER BY SUM(Pts) DESC