比较日期相同的列mySQL Laravel

时间:2015-08-17 16:20:35

标签: mysql sql laravel-4

我有一个'任务'表格如下所示: enter image description here

我需要计算每条记录的开始日期偏移量;我需要计算每个记录的开始日期的最小/最低开始日期之后的天数。

我在Laravel 4中这样做。该表是mySQL。我真的更喜欢Laravel查询,但我可能还包括原始mySQL。

我的查询(它也选择其他一些东西)不起作用

    $tasks = DB::table('tasks')->select(array(DB::raw("TIMESTAMPDIFF(DAY, MIN(start), start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))->where('temp_id', $id)->orderBy('start')->get();

" MIN(开始)"对于自我比较似乎是问题。如何计算最小开始日期后每个记录的开始日期是多少天?

1 个答案:

答案 0 :(得分:0)

我看到两种可能的解决方案来解决非聚合结果集上MIN(start)的错误使用问题。

选项一:将变量保存为最小日期并在查询中使用该变量:

$min_date = DB::table("tasks")->selectRaw("id, MIN(start) AS min")->groupBy("id")->first();
echo $min_date->min; // 2015-08-15 00:00:00, assuming my syntax was correct.

$tasks = DB::table('tasks')
->select(array(DB::raw("TIMESTAMPDIFF(DAY, ".$min_date->min.", start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))
->where('temp_id', $id)
->orderBy('start')
->get();

选项二:在select:

中使用子查询
$tasks = DB::table('tasks')
->select(array(DB::raw("TIMESTAMPDIFF(DAY, (SELECT MIN(start) FROM tasks), start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))
->where('temp_id', $id)
->orderBy('start')
->get();

关于MIN()用法的注意事项:除非在子查询中使用,否则可以在不聚合结果的情况下使用它,但只返回单行。

示例:

SELECT start FROM tasks; /*6 Rows*/
SELECT MIN(start) FROM tasks; /*1 Row*/
SELECT MIN(start), start FROM tasks; /*1 Row*/
SELECT (SELECT (MIN(start) FROM tasks) AS min_start, start FROM tasks; /*6 Rows*/

最后一个示例将返回每行中的结果以及start中找到的最小tasks。希望这有助于清除您的问题。选项1或选项2都应该有所帮助,但是在您需要帮助时留下评论。