Mysql 选择日期之前存在n-1行的n行

Mysql 选择日期之前存在n-1行的n行,mysql,select,Mysql,Select,我正在尝试创建一个MySQL查询,其中它将选择最新的4行(按dateDESC,Y-m-d格式排序),其中最新的date在date\ux之后,至少在date\ux+1之前存在3行。例如,考虑以下记录: ----------------------- | id | date | | 1 | 2018-01-01 | | 6 | 2018-01-02 | | 10 | 2018-01-03 | | 26 | 2018-01-04 | | 27

我正在尝试创建一个MySQL查询,其中它将选择最新的4行(按
date
DESC,Y-m-d格式排序),其中最新的
date
date\ux
之后,至少在
date\ux+1
之前存在3行。例如,考虑以下记录:

-----------------------
|  id  |     date     | 
|   1  |  2018-01-01  |
|   6  |  2018-01-02  |
|  10  |  2018-01-03  |
|  26  |  2018-01-04  |
|  27  |  2018-01-05  |
|  34  |  2018-01-06  |
|  60  |  2018-01-07  |
-----------------------
如果
date\u x
=“0000-00-00”,则应返回:

-----------------------
|  id  |     date     | 
|   1  |  2018-01-01  |
|   6  |  2018-01-02  |
|  10  |  2018-01-03  |
|  26  |  2018-01-04  |
-----------------------
-----------------------
|  id  |     date     | 
|  27  |  2018-01-02  |
|  34  |  2018-01-03  |
|  60  |  2018-01-04  |
|  27  |  2018-01-05  |
-----------------------
-----------------------
|  id  |     date     |
-----------------------
如果
date\u x
=“2018-01-04”,则应返回:

-----------------------
|  id  |     date     | 
|   1  |  2018-01-01  |
|   6  |  2018-01-02  |
|  10  |  2018-01-03  |
|  26  |  2018-01-04  |
-----------------------
-----------------------
|  id  |     date     | 
|  27  |  2018-01-02  |
|  34  |  2018-01-03  |
|  60  |  2018-01-04  |
|  27  |  2018-01-05  |
-----------------------
-----------------------
|  id  |     date     |
-----------------------
如果
date\u x
=“2018-01-07”,则应返回:

-----------------------
|  id  |     date     | 
|   1  |  2018-01-01  |
|   6  |  2018-01-02  |
|  10  |  2018-01-03  |
|  26  |  2018-01-04  |
-----------------------
-----------------------
|  id  |     date     | 
|  27  |  2018-01-02  |
|  34  |  2018-01-03  |
|  60  |  2018-01-04  |
|  27  |  2018-01-05  |
-----------------------
-----------------------
|  id  |     date     |
-----------------------

有什么方法可以通过一个查询有效地实现这一点吗?

我认为这就是您试图实现的要点:

select t.*
from t
where date >= @date and
      (select count(*) from t t2 where t2.date >= @date) >= 3
order by date
limit 4;

你的问题和样本数据相当混乱。您可以说order by
date desc
,但示例结果似乎首先有最小的日期。您提到了
x_date+1
,但结果中没有提到这一点。我认为以上内容正是您想要的。

演示为日期提供值
'2018-01-04'

获取“
date\u x+1
”之前的行数。(我们可以将其与文字值进行比较,以确定是否至少有3行。)

获取(最多)四个最新的行

 SELECT t.id
      , t.date
   FROM mytable t
  ORDER BY t.date DESC
  LIMIT 4
综上所述,我们可以这样做

 SELECT t.id
      , t.date
   FROM mytable t
  WHERE 2 < ( SELECT COUNT(1) AS cnt
                FROM mytable d
               WHERE d.date <  '2018-01-04'  + INTERVAL 1 DAY
            )
    AND 0 < ( SELECT COUNT(1) AS cnt
                FROM mytable c
               WHERE c.date >  '2018-01-04'  + INTERVAL 0 DAY
            )
  ORDER BY t.date DESC
  LIMIT 4
规格不完全清楚。。。如果少于四行怎么办?如果有多行的日期>日期x+1怎么办


我怀疑还有更多的规格,我没有赶上。规范说我们希望“最新日期”在日期之后。。。不清楚我们是否应该只返回
date\u x
之后的第一个日期,而忽略后面的日期。

您确定它是按
date desc
排序的吗?格式是Y-m-d,很抱歉,这在原始帖子中不清楚。我已经编辑过了,“日期x+1”是什么?“在日期之后”将建议日期=2018-01-04,结果将不包括在此之前的日期。如果
date\ux='0000-00-00'
date\ux+1是什么?我看不出你是如何获得投票结果的,因为你需要描述一下你已经尝试/思考了什么,以及你在哪里陷入了困境。可能需要反转一些条件,因为与OP desire输出不匹配,并且需要一个大于日期的条件