MySQL查询来比较两个日期,它将从一列遍历到另一列

MySQL查询来比较两个日期,它将从一列遍历到另一列,mysql,Mysql,我有一张表格pa_acc_status,我附上了表格的图像 我想比较2个日期(一个是用户输入,另一个是列值),它将使用MYSQL在一个循环中从一列遍历到另一列 例如:首先,它将检查step\u 22\u due\u date列是否不为空,以及step\u 22\u due\u datestep\u 21\u completestep\u 21\u due\u date 我想要两种方式的输出 案例1:用户日期=2016-09-03 先这样 id | step_1_complete | step_2

我有一张表格
pa_acc_status
,我附上了表格的图像

我想比较2个日期(一个是用户输入,另一个是列值),它将使用MYSQL在一个循环中从一列遍历到另一列

例如:首先,它将检查
step\u 22\u due\u date
列是否不为空,以及
step\u 22\u due\u date
step\u 21\u complete
step\u 21\u due\u date

我想要两种方式的输出

案例1:用户日期=
2016-09-03

先这样

id | step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
1  |      NULL       | 2016-03-12       | NULL             | NULL             | 1
2  |      NULL       | 2016-03-12       | NULL             | NULL             | 1
3  |      NULL       |      NULL        |      NULL        | 2016-04-15       | 2
4  |      NULL       | 2016-03-12       | NULL             | NULL             | 2
5  |      NULL       |      NULL        | 2016-03-12       | NULL             | 2
id | step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
1  |      2016-03-08 | NULL             | NULL             | NULL             | 1
2  |      2016-03-08 | NULL             | NULL             | NULL             | 1
3  |      2016-03-08 | NULL             | NULL             | NULL             | 2
4  |      2016-01-03 | NULL             | NULL             | NULL             | 2
5  | NULL            | 2016-03-08       | NULL             | NULL             | 2
第二个是不为空的日期计数,并按用户id分组

step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
0          |  2         |  0         |  0         | 1
0          |  1         |  1         |  1         | 2
step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
2          |  0         |  0         |  0         | 1
2          |  1         |  0         |  0         | 2
案例2:用户日期=
2016-03-10

先这样

id | step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
1  |      NULL       | 2016-03-12       | NULL             | NULL             | 1
2  |      NULL       | 2016-03-12       | NULL             | NULL             | 1
3  |      NULL       |      NULL        |      NULL        | 2016-04-15       | 2
4  |      NULL       | 2016-03-12       | NULL             | NULL             | 2
5  |      NULL       |      NULL        | 2016-03-12       | NULL             | 2
id | step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
1  |      2016-03-08 | NULL             | NULL             | NULL             | 1
2  |      2016-03-08 | NULL             | NULL             | NULL             | 1
3  |      2016-03-08 | NULL             | NULL             | NULL             | 2
4  |      2016-01-03 | NULL             | NULL             | NULL             | 2
5  | NULL            | 2016-03-08       | NULL             | NULL             | 2
第二个是不为空的日期计数,并按用户id分组

step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
0          |  2         |  0         |  0         | 1
0          |  1         |  1         |  1         | 2
step_1_complete | step_21_due_date | step_21_complete | step_22_due_date | user_id
2          |  0         |  0         |  0         | 1
2          |  1         |  0         |  0         | 2

我不知道是否可以使用MySQL,任何帮助或建议都会有帮助。

最后我得到了解决方案,关于我的问题

用于数据列表

SET @USER_DATE = '2016-03-08';

SELECT *
FROM
  (SELECT `id`,
          `user_id`,
          `step_1_complete`,
          NULL AS `step_21_due_date`,
          NULL AS `step_21_complete`,
          NULL AS `step_22_due_date`
   FROM `pf_acc_status`
   WHERE `step_1_complete` IS NOT NULL
     AND `step_1_complete` <= @USER_DATE
     AND (`step_21_due_date` IS NULL
          OR step_21_due_date >= @USER_DATE)
   UNION ALL SELECT `id`,
                    `user_id`,
                    NULL AS `step_1_complete`,
                    `step_21_due_date`,
                    NULL AS `step_21_complete`,
                    NULL AS `step_22_due_date`
   FROM `pf_acc_status`
   WHERE `step_21_due_date` IS NOT NULL
     AND `step_21_due_date` <= @USER_DATE
     AND (`step_21_complete` IS NULL
          OR step_21_complete >= @USER_DATE)
   UNION ALL SELECT `id`,
                    `user_id`,
                    NULL AS `step_1_complete`,
                    NULL AS `step_21_due_date`,
                    `step_21_complete`,
                    NULL AS `step_22_due_date`
   FROM `pf_acc_status`
   WHERE `step_21_complete` IS NOT NULL
     AND `step_21_complete` <= @USER_DATE
     AND (`step_22_due_date` IS NULL
          OR step_22_due_date >= @USER_DATE)
   UNION ALL SELECT `id`,
                    `user_id`,
                    NULL AS `step_1_complete`,
                    NULL AS `step_21_due_date`,
                    NULL AS `step_21_complete`,
                    `step_22_due_date`
   FROM `pf_acc_status`
   WHERE `step_22_due_date` IS NOT NULL
     AND `step_22_due_date` <= @USER_DATE ) AS `a`
ORDER BY a.`id` ASC

当然有可能。您可以在存储过程中写入游标。如果您考虑使用
案例,则当步骤22\u到期日不为空,然后步骤22\u到期日当步骤21\u完成时,则性能将非常差。。。。其他的结束
您完全可以用这样的表达式编写逻辑@德鲁:我不知道光标,但我会在谷歌搜索。我应该在DB层还是编程层做什么?@OllieJones:谢谢,让我试试。