Php 按点和日期排序表
下面是我桌子的复制品。如下图所示,该行是按id和日期排序的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 | 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