Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何通过查询编写复杂的订单_Mysql - Fatal编程技术网

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

Mysql 如何通过查询编写复杂的订单,mysql,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

我在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
订货人(var_b*var_c)/var_a

基本上,我想做一些事情,从mytable中选择*,其中参数=变量的值顺序到顺序。我必须用一些公式来表示变量的顺序,但我找不到任何方法,它不涉及八个独立的CASE WHERE语句,这看起来非常混乱。还有其他建议吗


谢谢

整理东西的一种方法:

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个额外的列,您应该忽略。还有其他方法可以避免3个额外的列,比如使用variables
@var\u a:=
,但这会有其自身的混乱,我更喜欢上面的方法。

一个复杂的情况/结构就是你真正需要的,所以混乱在语法中。如果您想使查询更加优雅,请查看参考手册的部分。然后你会有这样的东西:

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
);
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))

对于向下和向下的方式,可以在
order by
子句中使用函数。具体来说,您可以使用
if
ifnull
函数。因此,您应该能够这样做:

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
);
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开头的字符串等,那么如果您想包含所有实数而不是整数,则正则表达式可能必须更加复杂。)

Mysql对您的业务逻辑一无所知,如果您不指出其中的一个。所以当..时,您应该使用case。。然后子句。您需要提供一个更具体的数据示例。我真的看不出您想要获得什么。此外,您可以从数据库中按元素排序。我不明白您试图订购的是什么。如果要将任何业务逻辑添加到mysql中,那么唯一的选项是
mysql存储过程
我知道我从数据库中按元素订购,我试图使用伪代码来解释我试图通过订购实现的逻辑。基本上所有的值都在不同的列中。我将编辑我的问题以澄清。