MYSQL按个案,列顺序排列

时间:2015-12-02 03:44:18

标签: mysql laravel

抱歉英语。

我的数据库中有一个名为" order_news"的列,我试图根据订单显示数据。

示例数据:

------------------------
id | title    | order_news
-------------------------
1  | news 1   | 0
--------------------------
2  | news 2   | 1
--------------------------
3  | news 3   | 2
---------------------------
4  | news 4   | 3
-------------------------

我的代码,我正在使用Laravel:

News::orderByRaw(
        "
        CASE 
         WHEN order_news = 1 THEN 1
         WHEN order_news = 2 THEN 2
         WHEN order_news = 3 THEN 3

         WHEN order_news = 0 THEN 1
         WHEN order_news = 0 THEN 2
         WHEN order_news = 0 THEN 3
       END
        DESC,
       created_at DESC
       "
     )
   ->take(3)
   ->get();

确定。如果位置1,2,3不存在。位置0占据了缺失的位置。

示例:

  1. 如果1没有退出= 0-2-3(新闻1,新闻3和新闻4)
  2. 如果2没有退出= 1-0-3(新闻2,新闻1和新闻4)
  3. 如果3没有退出= 1-2-0(新闻2,新闻3和新闻1)
  4. 用我的代码,1。和2.工作,但3.返回1-0-2,我想1-2-0。 可以帮我? TNX。

1 个答案:

答案 0 :(得分:1)

作为一个起点,对于相同条件(CASE),多个WHEN的{​​{1}}没有多大意义;只会使用其中一个。

事实上,WHEN order_news = 0 THEN ...表达式是导致此问题的原因。当您使用WHEN order_news = 0 ... s titlenews 2news 3检索项目时,您会得到以下内容:

news 1

由于title order_news your order clause your order value news 2 1 WHEN order_news = 1 THEN 1 1 news 3 2 WHEN order_news = 2 THEN 2 2 news 1 0 WHEN order_news = 0 THEN 1 1 news 2获得了相同的订单值(news 1),因此它们都位于1之前。因此,您获得的news 3值为order_news,而不是1-0-2

你的问题并不清楚你究竟想要什么,但很明显你当前的1-2-0声明不会让你到达那里。要解决这个问题,只需按CASE排名,或者根本不设置明确的排序。你当前的order_news声明已经很乱了,而且它不可扩展。