Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
Php 按点和日期排序表_Php_Sql_Sorting - Fatal编程技术网

Php 按点和日期排序表

Php 按点和日期排序表,php,sql,sorting,Php,Sql,Sorting,下面是我桌子的复制品。如下图所示,该行是按id和日期排序的 id | date | points 1 Jan 1, 2014 110 2 Feb 12, 2014 20 3 Mar 23, 2014 40 4 Apr 10, 2014 80 5 May 20, 2014

下面是我桌子的复制品。如下图所示,该行是按id和日期排序的

id     |        date         |    points   
1          Jan 1, 2014             110
2          Feb 12, 2014            20
3          Mar 23, 2014            40
4          Apr 10, 2014            80
5          May 20, 2014            30
6          June 3, 2014            60
7          Jan 15, 2014            10
8          Mar 5, 2014             70
9          Feb 8, 2014             50
10         June 10, 2014            5
我的目标是按50到10(从最高到最低)之间的点对行进行排序,并且最接近当前日期。我怎样才能做到这一点

所有行都必须作为最终结果包含

类似于:

SELECT *, CASE WHEN (points >= 10 AND points <= 50) THEN 1 ELSE 0 END AS order_points     
    FROM points
ORDER BY
    order_points DESC, 
    CASE 
        WHEN order_points = 1 THEN points
    END DESC,  DATEDIFF( date, NOW() )
SELECT*,当(点数>=10,点数有点猜测时的情况:

select a_date,points 
from t 
order by case when points between 10 and 50 then -1 else 1 end * points
   , abs(DATEDIFF( a_date, now()));
对于数据的子集:

+------------+--------+
| a_date     | points |
+------------+--------+
| 2014-03-23 |     40 |
| 2014-02-12 |     20 |
| 2014-06-10 |      5 |
| 2014-04-10 |     80 |
| 2014-01-01 |    110 |
+------------+--------+

你能提供结果应该是什么样的吗?不清楚你是否想要10-50以外的行,如果是,这些行应该如何分类,就像我说的“所有行都必须作为最终结果包括在内”。这将排除部分行。如果您想要50到10之间的点,您将不会拥有所有行,或者我不明白?我只希望50到10之间且与当前日期最接近的任何行位于顶部,其他行将移到行的底部。它不起作用,错误表示您的SQL语法有错误;c查看与您的MySQL服务器版本对应的手册,了解在第10行使用“按情况排序,当点在10到50之间,然后-1 else 1 end*points”的正确语法。如果是MySQL,为什么不这样标记它?现在我猜到了,并用
5.5.37-MariaDB
对其进行了测试。您使用的是什么版本?您可以创建fid吗dle。案例部分没有任何意义,但我认为如果你这样做会更好。创建一个表格和数据,我将填写查询
SELECT *
FROM MyTable
order by CASE WHEN Points BETWEEN 10 AND 50 THEN 0 ELSE 1 END, TheDate desc;

ID  TheDate    Points
--  ---------  ------
 5  20-MAY-14      30
 3  23-MAR-14      40
 2  12-FEB-14      20
 9  08-FEB-14      50
 7  15-JAN-14      10
10  10-JUN-14       5
 6  03-JUN-14      60
 4  10-APR-14      80
 8  05-MAR-14      70
 1  01-JAN-14     110