如何通过查询编写复杂的订单

时间:2011-08-22 09:35:33

标签: mysql

我在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

所以基本上,我想从mytable WHERE参数=值ORDER BY variable_to_order_by开始沿着SELECT *行。我将不得不为variable_to_order_by使用一些公式,但是我找不到任何方法来执行它,这不会涉及八个单独的CASE WHERE语句,而且这看起来非常混乱。还有其他建议吗?

谢谢!

3 个答案:

答案 0 :(得分: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
);

答案 1 :(得分: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开头的字符串,等等。)

答案 2 :(得分: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 :=这三个额外的列,但是它会有自己的混乱,我更喜欢上面的方法。