2012-05-20 34 views
0

我问过关于前一个线程中多行的问题,但现在我需要知道单个行。这是一个例子查询:MySQL - 如何查询一个值,但默认为另一个值?

SELECT * FROM table1 WHERE this = 5 LIMIT 1 

但如果发现没有行,那么我会它,然后找到记录有不同的值:

SELECT * FROM table1 WHERE this = 1 LIMIT 1 

所以,我要的是,找到一个排这个值为5,如果没有找到,则默认为查找值为1的行。我如何在单个查询中执行此操作? OR语句是这样工作的吗?

SELECT * FROM table1 WHERE this = 5 OR this = 1 LIMIT 1 

请问或语句的顺序尝试找到任何一行5的值,如果找到那么将停止并返回行?如果找不到,然后查找1,然后返回该行?如果没有,那么如何在一个查询中搜索一个值,如果找不到缺省值查找另一个值呢?

我在想这个查询:

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this ASC LIMIT 1 

但是这个查询将始终与1返回值,如果发现这两个值吗?所以我试过这个:

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1 

但是,如果两行都被发现正确的话,这总是会返回5的值?

+0

你想要什么,如果两行被发现发生的呢? –

+0

@伊格雷戈里无论选择什么。因此,如果选择从数据库查看记录的人的值为5,但没有记录的值为5,那么我希望它默认加载值为1. – John

+0

如果要选择“这个'有多个值?你是动态创建你的语句还是在程序中? – Ben

回答

1

您的问题似乎优先搜索5,只有找不到,然后搜索1.因此,您的第二个解决方案符合要求罚款。无论是只有5还是5和1,它都会返回5的值。

第二个选项

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1 
+0

我认为你是对的。我可能会想到这一点。因为如果某人选择查看值为5的行,它只会是IN(5,1)。 – John

+0

您的'order by'应该是'case'语句。不能保证'this'的顺序是正确的。 – Ben

+0

@Ben这就是为什么我们有这个DESC命令。这将确保结果按照“this”的降序进行排序,无论MySQL首次发现哪些行。 – somnath

0

试试这个

SELECT * 
FROM table1 tab 
WHERE tab.this = IF((SELECT COUNT(*) 
        FROM table1 
        WHERE this = 5) > 0, 5, 1) 

的IF内的查询被检查的次数。

我不确定其性能,但我认为这解决了您的问题。

+0

只是为了澄清,如果([评估此],[如果这是真的话],[如果这是假的]) – nycynik

+0

@nycynik是的,这是正确的。 – JHS

相关问题