【问题标题】:How do I enforce SQL join conditions across multiple joined rows?如何跨多个连接行强制执行 SQL 连接条件?
【发布时间】:2011-05-06 20:51:26
【问题描述】:

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

我正在尝试将锦标赛加入到游戏中,并且将来只撤回所有游戏的锦标赛。

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())

但我得到了相同的结果。

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

谢谢!

【问题讨论】:

标签: sql mysql


【解决方案1】:

可能是这样的:

SELECT DISTINCT t.* 
FROM tournaments t, (select id, event_date from games where event_date >= now() ) g
where t.game_id = g.id 

【讨论】:

  • 感谢您的回复 - 不幸的是,这似乎没有产生正确的集合。
【解决方案2】:

试试这个

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

【讨论】:

  • 这将为所有包含至少一场比赛的锦标赛提供未来 - 这是他已经拥有的。
  • 感谢您的回复 - Dave 是正确的 - 这与原始查询产生了相同的结果。
【解决方案3】:

我不确定这个确切的查询是否适合 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()
)

【讨论】:

    【解决方案4】:
    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())
    

    【讨论】:

    • 感谢您的回复 - 不幸的是,我无法让此查询产生正确的回复。
    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2011-12-11
    • 2013-04-19
    相关资源
    最近更新 更多