【问题标题】:MAX MIN date ranges for MYSQLMYSQL 的 MAX MIN 日期范围
【发布时间】:2016-11-17 01:37:30
【问题描述】:

这是使用 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);

【问题讨论】:

  • 先弄清楚查询。然后担心如何重新设计以适应joomla
  • 那是我的计划,那里写的查询在 Joomla 中有效,但它不是正确的查询。这就是我需要帮助的地方。

标签: php mysql date joomla


【解决方案1】:

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

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

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

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 语句运行。

【讨论】:

  • 效果很好,谢谢!我还有一个问题,是否只能在只有最大值和最小值的情况下返回?如果有两个 version_id 共享相同的 ucm_type 和 ucm_id?
  • 如果 ucm_type_id 和 ucm_item_id 对至少有 1 条记录,那么您将同时拥有最大值和最小值。最大值和最小值可能相同,但要么两者都存在,要么都不存在。
  • 对不起,我没有解释得很好,是否可以将其加载到同一个对象中:ucm_type_id、ucm_item_id、min_version_id、max_version_id、min_save_date、max_save_date?
  • 有可能,在t1 subuery 上加入#__ucm_history两次,一次使用min_save_date,另一次使用max_save_date(显然,使用2 id 列也加入)。
  • 对不起,伙计,我尝试了很多方法,但都无法获得。我能麻烦你写第二个答案,告诉我你的意思吗?
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多