2017-12-18 56 views
1

如果主条件匹配,返回结果基于主条件,无论二级条件是否匹配,如果没有匹配结果,则返回二级条件的数据库。mysql初选条件

以交换外汇为例,我有一个汇率表,我需要拿到美元汇率:英镑,如果没有,那么得到英镑汇率:美元。如果两者都有,只返还美元:英镑。

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

你怎么知道哪个记录是美元到英镑,反之亦然?我想我一直在看你为什么有外汇数据,其中一对货币的两种兑换率互不相反。你打算如何使用这些数据? –

回答

1

你可以得到所有相关的行,由origin_currency = ? DESC和限制对它们进行排序的行数(或只是阅读你的结果的第一行)。请参阅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

尝试使用这个小提琴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