代码之家  ›  专栏  ›  技术社区  ›  shedd

如何跨多个联接行强制执行SQL联接条件?

  •  3
  • shedd  · 技术社区  · 15 年前

    假设您有一个数据库模式,其中包含与游戏相关的锦标赛。一场比赛可能会有很多场比赛。

    我试着加入比赛,只在以后的所有比赛中退出。

    SELECT DISTINCT tournaments.*
    FROM tournaments
    INNER JOIN games ON tournaments.game_id = games.id
    WHERE games.event_date >= NOW();
    

    我要加入的表还有几个,但是为了这个例子,我已经简化了它。

    我的查询正在收回不是所有比赛的结果。

    我还尝试将条件转移到联接中:

    SELECT DISTINCT tournaments.*
    FROM tournaments
    INNER JOIN games ON (tournaments.game_id = games.id AND games.event_date >= NOW())
    

    但我得到了同样的结果。

    我如何确保所有返回的锦标赛在未来都有比赛-也就是说,在所有加入的行强制执行条件?

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  5
  •   Dave Costa    15 年前

    我不确定这个确切的查询是否适合MySQL。但是这个想法应该有效——对于每一个比赛,确定最早的比赛日期,并且只返回那些日期比现在大的比赛。

    SELECT * from tournaments
    WHERE id IN
    ( SELECT tournaments.id
      FROM tournaments INNER JOIN games ON tournaments.game_id = games.id
      GROUP BY tournaments.id
      HAVING MIN(games.event_date) >= now()
    )
    
        2
  •  1
  •   Joe Stefanelli    15 年前
    SELECT DISTINCT tournaments.*
        FROM tournaments
            INNER JOIN games 
                ON tournaments.game_id = games.id
                    AND games.event_date >= NOW()
        WHERE NOT EXISTS (SELECT NULL FROM games g2 WHERE g2.id = tournaments.game_id AND g2.event_date < NOW())
    
        3
  •  0
  •   Randy    15 年前

    可能是这样的:

    SELECT DISTINCT t.* 
    FROM tournaments t, (select id, event_date from games where event_date >= now() ) g
    where t.game_id = g.id 
    
        4
  •  0
  •   KenL    15 年前

    试试这个

    SELECT DISTINCT *
    FROM tournaments 
    where game_id in (
    Select id from games where event_date >= NOW()
    )