0

私は問題をできるだけうまく説明しようとします。プレイヤーのテーブルである「users1213」と「Loanperiodes」の2つのテーブルがあります。現在、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

このクエリでは良い結果が得られますが、誰かが 2 つのローン期間を取得したときに 1 つの問題があります。たとえば、PLAYER1 は現在 CLUB A に貸し出されているため、リストに表示されない場合があります。しかし、PLAYER1 も期限が切れたローン期間を CLUB B に持っている場合、PLAYER1 は LEFT JOIN のためにリストされます。これをクエリで解決する解決策はありますか、それともアレイを実行しているときに後で確認する必要がありますか?

どうもありがとう!

4

1 に答える 1

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

この例では、ユーザーが一度に持つことができるローンは1つだけであると想定しています(はい、履歴でさらに多くのローンを終了させることができますが、今日より前に開始し、将来終了するのは1つだけです)。

于 2013-02-03T23:57:41.577 に答える