2016-05-24 8 views
1

最後にgameDate、todays(存在する場合)、および次のgameDateを指定した行を選択しようとしています。 。 - awayTeamまたはhomeTeam最後のレコードを日付別に取得する2種類の異なるIDを取得する

awayTeam homeTeam gameDate 
    1   2  5/12/16 
    2   3  5/13/16 
    3   5  5/14/16 
    2   4  5/14/16 

私が直面しています問題はteamIDが2列に表示されることができるということです。それは次のようにある構造です。私はgroup by節を持つ多くのソリューションを見ていましたが、それはたった1つの列でしか動作しないようです。各チームの最後のgameDateに対応する行を取得したいと思います。例えば、(1,5)が返されます:

awayTeam homeTeam gameDate 
    1   2  5/12/15 
    3   5  5/14/16 

私は、最新のゲームをしたいので、今日から任意のゲーム、そして次のゲームは、私はこの問題を解決する最良の方法は、最初に取得することになります考えていました過去の行、次に今日の行を含むUNION ALL、次のゲームのUNION ALL。この表は小さく、約3,000行しかありません。私は以下のクエリを持っていますが、それはhomeTeamでのみ機能し、awayTeamには表示されません。また、以下のクエリは2.2秒かかるので、このような少数の行を持つテーブルの場合は非常に高いと思われます。

SELECT g . * 
FROM games g 
WHERE g.gameDate = (
SELECT MAX(g2.gameDate) 
FROM games g2 
WHERE g2.homeTeam = g.homeTeam 
AND gameDate < NOW() 
AND g.homeTeam 
IN (1, 5)) 
ORDER BY g.gameDate DESC 

私は関係なく、彼らはhomeTeamまたはawayTeam列に表示されるかどうかに、私は簡単にチームが果たしてきた最後の時間を得ることができるので、おそらくビューにこれを分割することについて考えたが、それはやり過ぎのように思えます。これはMySQL用です。御時間ありがとうございます。

答えて

1

これはあまりよくありませんが、それはあなたを助けるかもしれません。最も派生した内部のテーブルは、その日付に沿って1つの列のすべてのチームを取得します。次の部分は、各チームが最後にゲームをした日付を取得します。元のテーブルに戻って参加し、各チームの最新の最後の試合を元の形式に戻しました。説明するのは混乱しますが、内側から外側に向かってそれぞれの選択を1つ1つずつ実行すると、かなり単純です。

SQL Fiddle Demo

SELECT yt.* 
FROM 
    (SELECT 
    Team 
    , MAX(GameDate) AS GameDate 
    FROM 
    (SELECT AwayTeam AS Team, GameDate 
    FROM YourTable 
    UNION ALL 
    SELECT HomeTeam AS Team, GameDate 
    FROM YourTable) a 
    WHERE GameDate < NOW() 
    GROUP BY 
    Team) MaxDates 
JOIN YourTable yt ON (MaxDates.Team = yt.AwayTeam OR MaxDates.Team = yt.HomeTeam) 
    AND yt.GameDate = MaxDates.GameDate 
WHERE MaxDates.team in (1,5) 
+0

私はあなたのソリューションが近いと思いますが、それは非常に適切ではありません。別の行にINSERT INTO YourTable VALUES(1,4、 '2016-05-15');を追加してSQL Fiddle Demoを変更すると、3行が返されることがわかります。 1と5は、私が提供した例で一度しか表示されないので、あなたのソリューションは動作していると思います。 –

+0

@JustinPfenning答えを変更し、別の条件をJOINに追加しました。私は当初の日付に参加するのを忘れていました。 – SQLChao

関連する問題