MYSQL的MAX MIN日期范围

时间:2016-07-14 08:23:52

标签: php mysql date joomla

这是使用Joomla数据库类,但希望这是有道理的。我需要根据特定的日期范围返回最大日期和最小日期。我遇到的问题是,我还需要每个日期的version_id。我写的查询只返回最大日期值的版本。我想最终得到的是最小日期的版本ID和最小日期值以及最大日期和最大日期值的版本ID。我认为这可能是工会的一个案例,但我不确定如何。

$query->select('a.ucm_type_id, a.ucm_item_id, a.version_id, MIN(a.save_date), MAX(a.save_date)')
    ->from($db->quoteName('#__ucm_history') . ' AS a')
    ->where('a.save_date BETWEEN ' . $db->quote($from_date) . ' AND ' . $db->quote($to_date))
    ->where('a.ucm_type_id IN (' . implode(',',$db->quote($content_type_ids)) . ')')
    ->group(array('a.ucm_type_id', 'a.ucm_item_id', ));
    // Join over the users for the checked out user.
    $query->select('b.type_title AS type')
    ->join('LEFT', '#__content_types AS b ON b.type_id=a.ucm_type_id');

    $db->setQuery($query);

1 个答案:

答案 0 :(得分:2)

如果version_id字段在功能上依赖于ucm_type_iducm_item_id,则您的查询仅符合sql标准。在某些sql模式设置下的MySQL允许查询,如通过,这可能会导致一些令人讨厌的惊喜,因为version_id的值是不确定的。 Fortunatley,在最近的mysql版本中默认关闭此模式。

您需要在子查询中获取日期范围内的最大和最小日期,并将其重新加入原始表格,以获取与这些日期相关联的其他字段。

在sql中,您的查询将如下所示:

select a.ucm_type_id,
       a.ucm_item_id,
       a.version_id,
       a.save_date,
       if(a.save_date=t1.min_save_date, 'min','max') as min_or_max,
       b.type_title AS type 
from `#__ucm_history` a
inner join
    (select `ucm_type_id`, `ucm_item_id`, MIN(save_date) as min_save_date, MAX(save_date) as max_save_date
     from `#__ucm_history`
     where ucm_type_id IN (...)
           and save_date BETWEEN ... and ...
     group by `ucm_type_id`, `ucm_item_id`
    ) t1 on a.ucm_type_id=t1.ucm_type_id and a.ucm_item_id=t1.ucm_item_id
left join `#__content_types` AS b ON b.type_id=a.ucm_type_id
where a.save_date=t1.min_save_date or a.save_date=t1.max_save_date

使用来自php代码的参数替换...部分。

在sql环境中测试和调整你的查询,一旦你对它感到满意,然后使用你的ORM工具实现它。但我的猜测是你需要将它作为一个原始的sql语句来运行。