4

次の3つのテーブルがあります。

mysql> explain runners;
+-------------+------------------+
| Field       | Type             |
+-------------+------------------+
| runner_id   | int(10) unsigned |
| name        | varchar(100)     |
+-------------+------------------+

mysql> explain runs;
+-------------+------------------+
| Field       | Type             |
+-------------+------------------+
| run_id      | int(10) unsigned |
| runner_id   | int(10) unsigned |
| race_id     | int(10) unsigned |
| position    | int(10)          |
+-------------+------------------+

mysql> explain races;
+-------------+------------------+
| Field       | Type             |
+-------------+------------------+
| race_id     | int(10) unsigned |
| date        | datetime         |
+-------------+------------------+

次に、特定のランナーが参加したすべてのレースを次のように表示する必要があります。

mysql> select runner.name, runs.run_id, runs.position, races.race_id
       from runners
       join runs on(runs.runner_id = runners.runner_id)
       join races on(races.race_id = run.run_id)
       where runners.runner_id = 1;
+------------------+--------+----------+---------+
| name             | run_id | position | race_id |
+------------------+--------+----------+---------+
| John Runner      |      1 |        1 |       1 |
| John Runner      |      7 |        3 |       2 |
| John Runner      |     15 |        2 |       3 |
................... more lines ...................
+------------------+--------+----------+---------+

ここで、このクエリに「勝/秒」という別の列を追加する必要があります。これは、現在のランナーの位置 = 1 の場合は 2 番目に終了したランナーの名前を表示し、現在のランナーの位置 = 1 の場合はそのレースで優勝したランナーの名前を表示します。 != 1 ですが、これを機能させる方法や、何から始めればよいかさえわかりません。

4

4 に答える 4

1

これにより、必要なものが得られます。

select runners.name, 
   runs.run_id, 
   runs.position, 
   races.race_id,
   case
      when runs.position = 1
      then    runnerssecond.Name
      else    runnerswinner.Name
   end as NextColumn
from runners
   join runs on(runs.runner_id = runners.runner_id)
   join races on(races.race_id = runs.Race_Id)
   left join runs runswinner on runswinner.race_id = races.race_id and runswinner.Position = 1
   left join runners runnerswinner on runnerswinner.Runner_Id = runswinner.Runner_Id
   left join runs runsecond on runsecond.race_id = races.race_id and runsecond.Position = 2
   left join runners runnerssecond on runnerssecond.Runner_Id = runsecond.Runner_Id
where runners.runner_id = 1;

そしてSQLフィドル

幸運を。

于 2013-01-29T02:04:12.270 に答える
1

これにより、各レースの 1 位と 2 位のゲッターが得られます。

SELECT r1.race_id,
       r1.runner_id AS First,
       r2.runner_id AS Second
FROM   runs r1
       INNER JOIN
       runs r2 ON r1.race_id=r2.race_id AND r1.position=1 AND r2.position=2

これを他のテーブルに結合して、必要なものを取得できます

OK - 延長。これは SQL サーバーの構文です - 翻訳が必要な場合があります

select runner.name,
       runs.run_id, 
       runs.position, 
       races.race_id,
       case runs.position
            when 1 then pos.Second
            else pos.First
       end AS [First/Second] 
from runners
     inner join runs on runs.runner_id = runners.runner_id
     inner join races on races.race_id = run.run_id
     inner join (SELECT r1.race_id,
                        r1.runner_id AS First,
                        r2.runner_id AS Second
                 FROM   runs r1
                 INNER JOIN
                 runs r2 ON r1.race_id=r2.race_id AND r1.position=1 AND r2.position=2) as pos
where runners.runner_id = 1;

または、単純化する

select runner.name,
       r1.run_id, 
       r1.position, 
       r1.race_id,
       r3.name AS [First/Second]
from runners
     inner join runs r1 on r1.runner_id = runners.runner_id
     inner join (SELECT runners2.name
                 FROM runners runners2
                 INNER JOIN
                 runs r2 ON r1.race_id=r2.race_id 
                         AND r2.position=CASE r1.position WHEN 1 THEN 2 ELSE 1 END) r3
where runners.runner_id = 1;
于 2013-01-29T01:39:28.397 に答える
1

次のクエリは、1 番目と 2 番目の地名を事前に計算してから結合することで、これにアプローチします。

select runner.name, runs.run_id, runs.position, races.race_id,
       (case when runs.position = 1 then SecondRunner else FirstRunner end) as FirstOrSecond
from runners join
     runs
     on runs.runner_id = runners.runner_id join
     races
     on races.race_id = run.run_id join
     (select runs.race_id,
             max(case when position = 1 then runners.name end) as FirstRunner,
             max(case when position = 2 then runners.name end) as SecondRunner
      from runs join
           runners
           on runs.runner_id = runners.runner_id
    ) fs
    on fs.race_id = races.race_id
where runners.runner_id = 1

シンプルにしたい場合は、サブクエリを使用してください。

     select runs.race_id,
             max(case when position = 1 then runners.name end) as FirstRunner,
             max(case when position = 2 then runners.name end) as SecondRunner
      from runs join
           runners
           on runs.runner_id = runners.runner_id

追加情報も必要だと思いました。

于 2013-01-29T01:42:08.397 に答える
0

始めること:

  • ステップ 1: 1 番目を 5 列目、2 番目を 6 列目として取得します。
  • ステップ 2:IF位置列で を使用して、表示する式を決定します
于 2013-01-29T01:38:36.087 に答える