0

アップロードされたコインに関するすべての情報を提供するコイン テーブルと、特定のコインの所有者に関する情報を提供する所有者テーブルがあります。coin_owners テーブルには、' transfer ' または ' Reward ' のいずれかになる 'ownership_mode' フィールドがあります。モードが「転送」の場合は転送テーブルに参加したままにし、モードが「報酬」の場合は報酬テーブルに参加したい。

CASE句を使用してこれを試しましたが、機能しません。

私が試したクエリは次のとおりです。

SELECT * , coins.id AS CoinId FROM coins
LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
LEFT JOIN (CASE WHEN coin_owners.`ownership_mode` = 'transfer' THEN transfer_detail ON   transfer_detail.transfer_to = coin_owners.current_owner
AND transfer_detail.transfer_from = SUBSTRING_INDEX( coin_owners.previous_owner,  ',',  '-1' )  
WHEN coin_owners.`ownership_mode` = 'Reward' THEN rewards ON rewards.`coin_ids` = coin_owners.coin_id
AND coin_owners.`ownership_mode` =  'Reward'
AND STATUS =  '0'
) WHERE coins.id ='".validString($_REQUEST["coinId"])."' LIMIT 0,1
4

2 に答える 2

1

CASEは式です。テーブル参照内では使用できません。別々のクエリを使用して両方のケースを処理する必要があります。これらは次を使用して組み合わせることができますUNION

(
  SELECT …
  FROM coins
  LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
  LEFT JOIN transfer_detail
    ON transfer_detail.transfer_to = coin_owners.current_owner
    AND transfer_detail.transfer_from =
        SUBSTRING_INDEX(coin_owners.previous_owner, ',', '-1')
  WHERE coin_owners.ownership_mode = 'transfer'
  AND coins.id = ?
UNION ALL
  SELECT …
  FROM coins
  LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
  LEFT JOIN rewards
    ON rewards.coin_ids = coin_owners.coin_id
    AND STATUS =  '0'
  WHERE coin_owners.ownership_mode = 'Reward'
  AND coins.id = ?
)
LIMIT 0,1

両方のクエリの列が一致することを確認する必要があります。おそらく、いずれかNULLのクエリに対応する値がない列に値を挿入することによってです。

また、渡された値が SQL インジェクションに対して安全であることを完全に確認しない限り、要求パラメーターを文字列に挿入しないでください。準備済みステートメントを使用する方が良いため、?代わりにクエリを代入しました。

于 2013-05-10T14:39:37.320 に答える