2

昨日の質問の続きです。

ここに私の3つのテーブルがあります:

ファイターズテーブル

fighter_id |  name
-----------------------
1          | John
2          | Steve
3          | Bill
4          | Bobby

イベント テーブル

event_id  |  event_name  |  event_date
-------------------------------------------
1          | MMA         |  01/01/2010
2          | Cool        |  02/20/2010
3          | Yeaa!       |  04/15/2010

ファイトテーブル

fight_id  |  fighter_a  |  fighter_b  |  winner  |  method  |  event
-----------------------------------------------------------------------
1         | 1           |  2          |  1       | Sub      | 1
2         | 4           |  1          |  4       | KO       | 2
3         | 1           |  3          |  NULL    | Draw     | 3

取得しようとした結果

result  |  opponent  |  method  |  event  |  date        
----------------------------------------------------------
Draw    | Bill       |  Draw    |  Yeaa!  |  04/15/2010  
Loss    | Bobby      |  KO      |  Cool   |  02/20/2010 
Win     | Steve      |  Sub     |  MMA    |  01/01/2010

したがって、fights テーブルでは、fighter_a、fighter_b、および Winner は、Fighters テーブルの fighter_id に対応する整数です。

私は基本的に、fighter_id ($fighter_id) に基づいてデータを取得するページにいます。

対戦相手の名前、結果 (win、loss、draw、または nc)、method、event_name、および event_date を含む、そのファイターの各戦いで行を作成しようとしています。課題は、勝者がfighter_aまたはfighter_bのいずれかにいる可能性があることです。常に同じ列にあるとは限りません。私が得ることができる助けに感謝します。

select 
    fight_id,
    CASE
      WHEN winner is not null and winner=fighter_id then 'win'
      WHEN winner is not null and winner<>fighter_id then 'loss'
      WHEN winner is null and method='Draw' then 'draw'
      WHEN winner is null and method = 'No Contest' then 'no contest'
      ELSE ''
    END as match_result,
    participant.name 'participant',
    opponent.name 'opponent'
FROM fights
    INNER JOIN fighters as participant on participant.fighter_id = fights.fighter_a
    INNER JOIN fighters as oppoent on opponent.fighter_id = fights.fighter_b
WHERE 
    fighter_a=$fighter_id OR fighter_b=$fighter_id
ORDER BY
    event_date DESC
4

4 に答える 4

1

ユニオンを使用できます。

SELECT CASE WHEN winner = participant_id THEN 'Win'
            WHEN winner = opponent_id then 'Loss'
            ELSE method
       END AS result, fighters.name AS opponent, method, event_name, event_date
  FROM fights
  INNER JOIN fighters ON fighter_id = opponent_id
  INNER JOIN events ON event = event_id
  WHERE participant_id = $fighter_id
UNION ALL
SELECT CASE WHEN winner = participant_id THEN 'Loss'
            WHEN winner = opponent_id then 'Win'
            ELSE method
       END AS result, fighters.name AS opponent, method, event_name, event_date
  FROM fights
  INNER JOIN fighters ON fighter_id = participant_id
  INNER JOIN events ON event = event_id
  WHERE opponent_id = $fighter_id
ORDER BY event_date DESC
于 2012-06-12T23:25:43.507 に答える
1

条件付きの副選択を使用して、探しているfighter_idがcolumn_bにある場合はcolumn_aに切り替えます。これにより、操作が簡素化され、外側のクエリに結合されます。

SELECT
    (
        CASE
            WHEN a.winner = a.f_a THEN 'Win'
            WHEN a.winner = a.f_b THEN 'Loss'
            WHEN a.winner IS NULL THEN a.method
        END
    ) AS result,
    b.name AS opponent,
    a.method AS method,
    c.event_name AS event,
    c.event_date AS date
FROM
    (
        SELECT 
            IF(fighter_b = $fighter_id, fighter_b, fighter_a) AS f_a,
            IF(fighter_b = $fighter_id, fighter_a, fighter_b) AS f_b,
            winner,
            method,
            event
        FROM 
            fights
        WHERE
            $fighter_id IN (fighter_a, fighter_b)
    ) a
INNER JOIN
    fighters b ON a.f_b = b.fighter_id
INNER JOIN
    events c ON a.event = c.event_id
ORDER BY
    c.event_date DESC

また、勝者フィールドが null の場合は、メソッド フィールドをそのままエコーします。そうすれば、勝者が null である別のタイプのメソッドをシステムに追加する場合、CASEステートメントにさらに条件付きチェックを追加し続ける必要はありません。

于 2012-06-13T00:10:27.743 に答える
1

CASEと一致するようにステートメントを変更するだけです$fighter_id

したがって、あなたのCASE声明は-

select fight_id,
       CASE
           WHEN winner is not null and winner = f.fighter_id then 'win'
           WHEN winner is not null and winner <> f.fighter_id then 'loss'
           WHEN winner is null and method='Draw' then 'draw'
           WHEN winner is null and method = 'No Contest' then 'no contest'
           ELSE ''
        END as match_result,
        f.name AS participant,
        (SELECT o.name FROM fighters o WHERE o.fighter_id = IF(f.fighter_id = fs.fighter_a, fs.fighter_b, fs.fighter_a)) AS opponent
FROM fights fs,
     fighters f
WHERE f.fighter_id = $fighter_id
AND (fs.fighter_a = f.fighter_id OR fs.fighter_b = f.fighter_id)
于 2012-06-12T23:10:40.007 に答える
0
SELECT
    CASE
      WHEN winner is not null and winner=fighter_id then 'win'
      WHEN winner is not null and winner<>fighter_id then 'loss'
      WHEN winner is null and method='Draw' then 'draw'
      WHEN winner is null and method = 'No Contest' then 'no contest'
      ELSE ''
    END result,
    f2.name opponent,
    method,
    event_name event,
    event_date date
FROM fights f1
INNER JOIN fighters f2
ON f1.fighter_b = f2.fighter_id
INNER JOIN events e
ON e.event_id = f1.event
ORDER BY date DESC
于 2012-06-12T23:54:22.827 に答える