2017-12-18 6 views
1

プライマリ条件が一致した場合は、セカンダリ条件が一致しても一致しなくても結果ベースをリターンし、一致する結果がない場合はセカンダリ条件でデータベースを返します。プライマリ条件のmysql selectベース

私は為替レート表を持っている、私はドルの為替レートを取得する必要があります:英ポンド、ない場合は、英ポンドの為替レートを取得する:米ドル。両方がある場合、私達のドルだけ戻す:イギリスポンド。

id origin_currency  target_currency  rate_from  rate_to 
1  1     2     1    0.75  
2  2     1     1    1.34 

上記のデータの場合、クエリsqlは最初のレコードのみを返す必要があります。

私が欲しいものを得るために、次のSQLを使用することができます。

select * from exchange_rate 
where origin_currency = 1 and target_currency = 2 
union 
select * from exchange_rate 
where origin_currency = 2 and target_currency = 1 
limit 1 

しかし、他のよりよい解決策はありますか?

+0

どのレコードが米ドルとポンドの間でどのようにレコードされているのですか?私はペアの2つのコンバージョン率がお互いに逆転していない為替データがなぜあるのか見当たりません。このデータをどのように使用する予定ですか? –

答えて

1

このバイオリンを使用してみてください。このSQL Fiddleを参照してください。

SELECT 
    * 
FROM 
    currency 
WHERE 
    (origin_currency = 1 AND target_currency = 2) OR 
    (origin_currency = 2 AND target_currency = 1) 
ORDER BY 
    origin_currency = 1 DESC 
LIMIT 
    1 
1

あなたは、関連するすべての行を取得origin_currency = ? DESCことによって、それらを並べ替えるとリミット行数を(またはちょうどあなたの結果から最初の行を読む)ことができますsql_fiddle

SELECT * 
FROM currency 
WHERE 
    (origin_currency, target_currency) = 
    (SELECT origin_currency, target_currency FROM currency 
    WHERE (origin_currency, target_currency)=(1,2) 
      UNION ALL 
      SELECT origin_currency, target_currency 
      FROM currency WHERE (origin_currency, target_currency)=(2,1) 
      LIMIT 1) 
+0

これがなぜ優れているのか教えてください。 – frank

+0

私は、この状態には多くの解決策があると思います。私の解決策は私の考えです。この[sqlfiddle](http://sqlfiddle.com/#!9/656817/11)は最善の答えのようです。 –

+0

あなたの意見に感謝して、それは私に別の見通しを与える。 – frank