2013-02-03 44 views
0

我会尽可能好地解释问题。 我有两个表“用户1213”,这是一个玩家表和“贷款期限”表。现在我试图立即用一个sql查询获得俱乐部目前的球员名单。如果他们被借用到另一个俱乐部,他们不必在名单上。俱乐部也有可能借给一名球员,所以这些球员也必须在名单上。所以我有这样的时刻(俱乐部有一个ID为“1”,团队也是一个ID为“1”):将左表与左连接相结合的问题

SELECT users1213.id, surname, name, team, club, loanclub 
FROM users1213 
LEFT JOIN loanperiode ON users1213.id = loanperiode.player 
WHERE users1213.status = 'player' 
AND (
(
users1213.club != '1' 
AND loanperiode.loanclub = '1' 
AND loanperiode.begin <= '2013-02-03' 
AND loanperiode.end >= '2013-02-03' 
AND (
uitleenperiodes.team_id = '1' 
) 
) 
OR (
users1213.club = '1' 
AND users1213.team = '1' 
AND (
loanperiode.loanclub IS NULL 
OR (
loanperiode.loanclub IS NOT NULL 
AND (
loanperiode.begin < '2013-02-03' 
AND loanperiode.end < '2013-02-03' 
) 
OR (
uitleenperiodes.begin > '2013-02-03' 
AND uitleenperiodes.end > '2013-02-03' 
) 
) 
) 
) 
) 
GROUP BY users1213.id 
ORDER BY name 
LIMIT 0 , 30 

与此查询我得到一个好的结果,但有1个的问题,当有人得到了2个贷款期限。例如PLAYER1现在借给CLUB A,所以他可能不会被列出。但是,当PLAYER1还有一个已经到期的贷款期限时,对于CLUB B,由于LEFT JOIN,PLAYER1将被列出。有没有一个解决方案来解决这个查询或者我必须在运行数组时检查?

非常感谢!

+0

什么是'uitleenperiodes'一个被遗忘的未被荷兰人等同于loandperiode? –

回答

0
SELECT users1213.id, surname, name, team, club, loanclub 
FROM users1213 
LEFT JOIN loanperiode ON users1213.id = loanperiode.player 
    AND '2013-02-03' BETWEEN loanperiode.begin AND loanperiode.end 

WHERE 
loanperiode.loanclub = '1' 
OR (loanperiode.loanclub IS NULL -- I suppose this happens only when there is no loan between those dates so nothing LEFT JOINed 
AND users1213.club = '1') 

ORDER BY name 

这个例子假定该用户只能有一个贷款一次(是的,他可以有更多的贷款的历史结束了,但只有一个今天才开始和结束在未来)。