左联接中的多行导致重复数据

时间:2020-01-07 14:13:00

标签: mysql sql

我有一个相当复杂的MySQL查询,旨在从下表中检索球队及其联赛表现:

团队

Error Code: 1052. Column 'table2.idProjet' in on clause is ambiguous

division_season_team

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name             | varchar(80)      | NO   | UNI | NULL    |                |
| primary_colour   | varchar(30)      | YES  |     | NULL    |                |
| secondary_colour | varchar(30)      | YES  |     | NULL    |                |
| tertiary_colour  | varchar(30)      | YES  |     | NULL    |                |
| logo_url         | text             | YES  |     | NULL    |                |
| narrative        | text             | YES  |     | NULL    |                |
| club_id          | int(10) unsigned | YES  | MUL | NULL    |                |
| created_at       | timestamp        | YES  |     | NULL    |                |
| updated_at       | timestamp        | YES  |     | NULL    |                |
| deleted_at       | timestamp        | YES  |     | NULL    |                |
+------------------+------------------+------+-----+---------+----------------+

team_point_adjustments

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| division_id | int(10) unsigned | YES  | MUL | NULL    |                |
| season_id   | int(10) unsigned | YES  | MUL | NULL    |                |
| team_id     | int(10) unsigned | YES  | MUL | NULL    |                |
| created_at  | timestamp        | YES  |     | NULL    |                |
| updated_at  | timestamp        | YES  |     | NULL    |                |
| deleted_at  | timestamp        | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

匹配

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| point_adjustment | int(11)          | NO   |     | 0       |                |
| reason           | varchar(191)     | NO   |     | NULL    |                |
| reason_date      | date             | NO   |     | NULL    |                |
| team_id          | int(10) unsigned | YES  | MUL | NULL    |                |
| season_id        | int(10) unsigned | YES  | MUL | NULL    |                |
| created_at       | timestamp        | YES  |     | NULL    |                |
| updated_at       | timestamp        | YES  |     | NULL    |                |
+------------------+------------------+------+-----+---------+----------------+

以下是查询:

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| home_score  | int(11)          | NO   |     | 0       |                |
| away_score  | int(11)          | NO   |     | 0       |                |
| division_id | int(10) unsigned | YES  | MUL | NULL    |                |
| season_id   | int(10) unsigned | YES  | MUL | NULL    |                |
| home_id     | int(10) unsigned | YES  | MUL | NULL    |                |
| away_id     | int(10) unsigned | YES  | MUL | NULL    |                |
| match_date  | datetime         | NO   |     | NULL    |                |
| court       | int(10) unsigned | NO   |     | NULL    |                |
| round       | int(10) unsigned | NO   |     | NULL    |                |
| played      | tinyint(1)       | NO   |     | 0       |                |
| walkover    | tinyint(1)       | NO   |     | 0       |                |
| home_adjust | int(11)          | NO   |     | 0       |                |
| away_adjust | int(11)          | NO   |     | 0       |                |
| created_at  | timestamp        | YES  |     | NULL    |                |
| updated_at  | timestamp        | YES  |     | NULL    |                |
| deleted_at  | timestamp        | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

以下结果为例:

"SELECT 
        t.name AS team_name,
        t.id as team_id,
        SUM(win) AS win,
        SUM(draw) AS draw,
        SUM(loss) AS loss,
        SUM(goals_for) AS goals_for,
        SUM(goals_against) AS goals_against,
        SUM(goal_difference) as goal_difference,
        SUM(games_played) AS games_played,
        SUM(points) + IFNULL(tpa.point_adjustment, 0) as points
        FROM teams t 
        LEFT JOIN team_point_adjustments tpa
            ON t.id = tpa.team_id
            AND (tpa.season_id = 1 OR tpa.season_id IS NULL)
        INNER JOIN
            division_season_team dst
            ON t.id = dst.team_id
        LEFT JOIN (
            SELECT home_id
                team_name,
                IF(home_SCORE > away_score, 1,0) win,
                IF(home_score = away_score, 1,0) draw,
                IF(home_score < away_score, 1,0) loss,
                home_score goals_for,
                away_score goals_against,
                home_score - away_score goal_difference,
                1 games_played,
                CASE WHEN home_score > away_score THEN 5 WHEN home_score = away_score THEN 2 ELSE 0 END points
            FROM matches mat WHERE played = 1 AND season_id = 1 AND division_id = 1
            UNION ALL 
            SELECT away_id,
                IF(home_score < away_score, 1, 0),
                IF(home_score = away_score, 1,0),
                IF(home_score > away_score, 1,0),
                away_score,
                home_score,
                away_score - home_score goal_difference,
                1 games_played,
                CASE WHEN home_score < away_score THEN 5 WHEN home_score = away_score THEN 2 ELSE 0 END
            FROM matches
            WHERE played = 1 AND season_id = 1 AND division_id = 1
            ) AS total ON total.team_name=t.id WHERE dst.season_id = 1 AND dst.division_id = 1
        GROUP BY t.id
        ORDER BY points DESC, goal_difference DESC"

问题出在{ "team_name": "Jets", "team_id": 20, "win": "8", "draw": "0", "loss": "4", "goals_for": "354", "goals_against": "265", "goal_difference": "89", "games_played": "12", "points": 40 } 上的第一个左联接。如果两行匹配,即有2行对应于一个团队,则返回的数据将增加一倍-比赛次数,获胜次数,得分等均应达到的两倍。

尝试为此子查询添加group by子句,但出现语法错误。如果此左联接中只有一个匹配的行,则数据都是正确的。

1 个答案:

答案 0 :(得分:-2)

如果重复行中的数据完全相同,则DISTINCT将在此处提供帮助

“ SELECT DISTINCT t.name AS team_name, t.id为team_id, SUM(win)AS赢, SUM(draw)AS抽奖, SUM(损失)AS损失, SUM(goals_for)AS目标_for, ...”等等