2011-08-22 74 views
1

我在MYSQL中有一个表,我需要执行一个select,然后通过相当复杂的逻辑对其进行排序。这里是我的逻辑示例:如何通过查询写一个复杂的订单

if(column_a is not null && column_a > 0){ 
    var_a = column_a 
else 
    var_a = 1; 

if(column_a is not null){ 
    var_b = column_b 
else 
    var_b = 0 

if(column_c is not null){ 
    var_c = column_c 
else 
    var_c = column_d 

ORDER BY(var_b * var_c)/ var_a

所以基本上,我想做的事SELECT *从mytable的WHERE参数=值ORDER东西线BY variable_to_order_by。我将不得不使用一些公式来处理variable_to_order_by,但我找不到任何这样做的方法,它不涉及八个单独的CASE WHERE语句,而且看起来非常混乱。还有其他建议吗?

谢谢!

+0

如果你没有指出关于你的业务逻辑的信息,那么Mysql并不知道你的业务逻辑。所以你应该使用case .. then子句。 –

+0

您需要提供一个更具体的数据示例。我真的不明白你想要获得什么。 –

+0

此外,您可以通过数据库中的元素进行排序。我不明白你想要点什么。 –

回答

1

对于下和肮脏的方式,你可以在order by子句中使用的功能。具体而言,您可以使用ififnull函数。因此,你应该能够做这样的事情:

SELECT ... 
ORDER BY IF(some_value IS NOT NULL AND some_value RLIKE '^[[:digit:]]+$', some_value, other_value) 
     - (column_baz + IF(foo > bar, a, b))/(IFNULL(yet_another_value, 0) + IF(foo > bar, a, b)) 

(其中如果要包括所有的实数,而不只是整数,如果你不希望包括正则表达式可能要更复杂一个以0开头的字符串等等)

+0

谢谢,这对我最有效。 – Catherine

0

一个整理东西的方法:

SELECT my_table.*, 
    IF(foo > bar, a, b) AS var_a, 
    IF(some_value IS NOT NULL AND 
     is_numeric(some_value), some_value, other_value) AS var_b, 
    IFNULL(yet_another_value, 0) AS var_c 
FROM my_table 
ORDER BY var_b - (column_baz + var_a)/(var_c + var_a) 

会有在结果3个额外的列,你应该忽略。还有其他方法可以避免使用变量@var_a :=这3个额外的列,但这会有其自己的混乱,我更喜欢上述方法。

1

一个复杂的案例/其中结构真的是你需要的,所以混乱是在语法。如果您想使查询更优雅,请参阅参考手册的Adding New Functions to MySQL部分。然后你就会有这样的事情:

SELECT * from mytable WHERE parameter = value 
ORDER BY meaningfull_name_of_logic(
    foo, bar, some_value, other_value, yet_another_value, column_baz, a, b 
);