mysql - 选择数据库的最新/最新添加

标签 mysql sql database mariadb

我有一个数据库表,其中包含对指定 smlouva 执行的操作列表。我需要的是选择为每个 smlouva 执行的最新/最新操作,该操作以时间范围和操作类型为条件。

Action 表如下:

ID (int, Primary), action_ID(int), date(datetime), smlouvy_id(int)

以及一些数据:

id      action  date                   smlouva_id
617872  -9      2016-08-25 08:43:00    114779
617871  -9      2016-08-25 08:43:00    114778
617867  -1      2016-08-25 08:30:00    114777
617865  -1      2016-08-25 08:27:00    114777
617864  -9      2016-08-25 08:27:00    114777
617839  -1      2016-08-25 08:24:00    114776
617838  -9      2016-08-25 08:23:00    114776
617837  105     2016-08-25 08:23:00    114775

我想要应用的约束是:

  • 日期:考虑采取行动的最短日期时间(可选的最长日期时间)
  • 操作:我只需考虑此列表中的操作(100、101、104、105、106、102、103、-9)

在这些约束内,我想为每个 smlouva_id 选择最新/最新的行 - 具有最新日期的行。事实上,我只需要该行的 smlouva_idaction

因此对于此数据,正确的结果将是:

id      action  date                   smlouva_id
617872  -9      2016-08-25 08:43:00    114779
617871  -9      2016-08-25 08:43:00    114778
617864  -9      2016-08-25 08:27:00    114777
617838  -9      2016-08-25 08:23:00    114776
617837  105     2016-08-25 08:23:00    114775

或者同样足够:

action  smlouva_id
-9      114779
-9      114778
-9      114777
-9      114776
105     114775

尝试过但失败

我尝试了几个命令,但它们似乎都不起作用。

SELECT action, smlouva_id 
FROM `pov_action` AS `O` 
WHERE ( 
  SELECT MAX(`date`) 
  FROM `pov_action` AS `I` 
  WHERE (
    (I.action = 100) 
    OR (I.action = 101) 
    OR (I.action = 104) 
    OR (I.action = 105) 
    OR (I.action = 106) 
    OR (I.action = 102) 
    OR (I.action = 103) 
    OR (I.action = -9)
  ) 
  AND (I.`smlouva_id` = O.`smlouva_id`) 
) 
AND (date >= '2016-08-25 08:28:07')

或者这个:

SELECT action, smlouva_id 
FROM `pov_action` 
WHERE (date >= '2016-08-25 09:23:09') 
  AND (
    (action = 100) 
    OR (action = 101) 
    OR (action = 104) 
    OR (action = 105) 
    OR (action = 106) 
    OR (action = 102) 
    OR (action = 103) 
    OR (action = -9)
  ) 
GROUP BY `smlouva_id`
(HAVING date = MAX(date)) -- optionally does not work with nor without
ORDER BY chdate DESC

服务器版本:5.5.50-MariaDB MariaDB服务器

最佳答案

使用派生表查找每个 smlouva_id 的最后日期,使用 GROUP BY

JOIN 具有该结果的表:

select t1.*
from tablename t1
  join (select smlouva_id, max(date) as maxdate
        from tablename
        where action in (100, 101 ,104, 105, 106, 102, 103, -9)
        group by smlouva_id) t2
  ON t1.smlouva_id = t2.smlouva_id and t1.date = t2.maxdate
where t1.action in (100, 101 ,104, 105, 106, 102, 103, -9)

关于mysql - 选择数据库的最新/最新添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39139686/

相关文章:

mysql - 使用 laravel 在 AUTO_INCREMENT 字段中设置 id 值

mysql查询不像几个文本匹配

mysql - 如何获取task_start_date早于3天的任务详细信息?

sql - Oracle SQL技术避免填充事务日志

mysql - 将SQL文件导入mysql

MySQL 中在 where 内计数不同的情况

php - 为什么PHP版本运行速度比MySQL快

MySQL AND 与 OR 条件

mysql - 如何用mysql在触发器中声明变量?

mysql - 将 WordPress 从子域迁移到根域