2017-10-20 5 views
-1

私はMySQLを初めて使用しているので、私は書く必要があります。 MLBに所属する野球選手のデータベースとそのすべての統計を考慮すると、ボストンレッドソックスの野球チームで少なくとも3年連続してプレイした選手を示すクエリを書く必要があります。ここで私がこれまで持っているものです。SQLはチームで3年連続してプレイしています

SELECT player.nameFirst, player.nameLast 
FROM player 
WHERE (...something something...) >= 3 
AND player.teamID = "Boston Red Sox" 

としてだけでなく、プレーヤーのテーブルには、playerIDが含まれていると呼ばれる別のテーブル表示され、そこにあり、その後、年、彼らはチームのためにプレーしました。出現テーブルには、その季節の統計情報などの他の情報もあります。たとえば、1人のプレイヤーが4年間赤いソックスをプレイした場合、出現テーブルには4つの行が表示されます。各行には、そのチームで何年プレーしたかを示す整数が表示されます。

質問が複雑になった後、私は最初にどのようにしたらよいか分かりません。プレイヤーがチームにいた年数を数えます。その年が連続していたかどうかを知る方法はありません。助けてくれてありがとう!

+3

ない十分な情報が...いくつかの日付フィールドがありますか? –

+0

申し訳ありません、編集内容を確認してください^ – cheesebal35

+0

3年連続でチームに所属していなかったプレイヤーを見つけてください。 – Strawberry

答えて

1

appearsテーブルに2回参加して、関連する年の外観を見つけます。

SELECT DISTINCT a1.playerID 
FROM appears AS a1 
JOIN appears AS a2 ON a1.playerID = a2.playerID AND a1.year = a2.year-1 
JOIN appears AS a3 ON a1.playerID = a3.playerID AND a1.year = a3.year-2 

あなたはそれらのプレーヤーに関するその他の情報を得るためにあなたの元のクエリと、このサブクエリに参加することができます。

DISTINCTは、3年以上連続してプレイしていても、1度だけプレーヤーIDを返すようにしています。

+0

ええと...私はこのクエリを試みると、 "クエリ中にMySQLサーバへの接続が失われました"というエラーが表示されます。クエリが計算に時間がかかり過ぎることはありますか?私が働いているこれらのテーブルはすべて非常に大きいです。 – cheesebal35

+0

大きい場合は、 'year'カラムにインデックスを追加してください。 – Barmar

+0

@ cheesebal35別の簡単なクエリでMySQLへの接続を確認してください。また、フィールドの名前が正しいことを確認します。 –

1

@ Barmar者の指示に従い、あなたのクエリは次のようになります必要があります。

SELECT DISTINCT player.nameFirst, player.nameLast 
FROM player 
INNER JOIN (
    SELECT DISTINCT a1.playerID 
    FROM appears AS a1 
    JOIN appears AS a2 ON a1.year = a2.year-1 
    JOIN appears AS a3 ON a1.year = a3.year-2 
) AS ap ON player.playerID = ap.playerID 
WHERE player.teamID = "Boston Red Sox" 
+0

このクエリは、私のマシンで実行するには時間がかかりすぎていると思うので、実行の30秒後に失敗するたびに – cheesebal35

+1

私の答えを編集する、自己結合でプレイヤーIDを使うのを忘れた – Barmar

+0

良い点@Barman;) –

関連する問題