gpt4 book ai didi

mysql - 根据到期时间获取行

转载 作者:可可西里 更新时间:2023-11-01 06:30:31 26 4
gpt4 key购买 nike

http://sqlfiddle.com/#!9/406cb/2

我有一个类别为 1、2、3、4 的表格书籍。

  • 第 1 类 - 将停留 1 小时
  • 第 2 类 - 将停留 2 小时
  • 第 3 类 - 将停留 4 小时
  • 第 4 类 - 将停留 6 小时

如何编写查询以获得所需的结果?

例如:

  1. 如果当前时间是 1454411248 那么它应该显示所有的书
  2. 如果当前时间为 1454414847,则不应显示 unixtime=1454411248(一小时后到期)的类别 1 书籍
  3. 如果当前时间是 1454418448,类别 - 1、2、4、6 小时到期时间以下的 1、2、3、4 不应显示(unix_time 将是动态的。我使用了静态例如值)。

等等..

表格:

CREATE TABLE `books` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`name` longtext NOT NULL,
`category` varchar(255) NOT NULL,
`unix_time` bigint(20) NOT NULL,
`time_data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;


INSERT INTO `books` (`id`, `name`, `category`, `unix_time`, `time_data`) VALUES
(1, 'book1', '1', 1454411248, '2016-02-02 05:37:28'),
(2, 'book2', '2', 1454411248, '2016-02-02 05:37:28'),
(3, 'book3', '3', 1454411248, '2016-02-02 05:37:28'),
(4, 'book4', '4', 1454411248, '2016-02-02 05:37:28'),
(5, 'book5', '1', 1454411248, '2016-02-02 05:37:28'),
(6, 'book6', '2', 1454411248, '2016-02-02 05:37:28'),
(7, 'book7', '3', 1454411248, '2016-02-02 05:37:28'),
(8, 'book8', '4', 1454411248, '2016-02-02 05:37:28'),
(9, 'book9', '1', 1454497648, '2016-02-03 05:37:28'),
(10, 'book10', '2', 1454497648, '2016-02-03 05:37:28'),
(11, 'book11', '1', 1454497648, '2016-02-03 05:37:28'),
(12, 'book12', '2', 1454497648, '2016-02-03 05:37:28'),
(13, 'book13', '3', 1454497648, '2016-02-03 05:37:28'),
(14, 'book14', '4', 1454497648, '2016-02-03 05:37:28'),
(15, 'book15', '1', 1454497648, '2016-02-03 05:37:28'),
(16, 'book16', '2', 1454497648, '2016-02-03 05:37:28'),
(17, 'book17', '3', 1454497648, '2016-02-03 05:37:28'),
(18, 'book18', '4', 1454497648, '2016-02-03 05:37:28');

查询:

SELECT *,
CASE category
WHEN '1' THEN '1454407648'
WHEN '2' THEN '1454404048'
WHEN '3' THEN '1454396848'
WHEN '4' THEN '1454389648'
END as category
from books
where unix_time >1454411248

最佳答案

首先,您需要一个表格将您的 category 值与您的 duration 值相关联。您可以创建物理表,也可以使用像这样的子查询来生成虚拟表。

   select 1 as category, 1 as duration UNION ALL
select 2,2 UNION ALL select 3,4 UNION ALL select 4,6

这会产生以下小查找表。

|| *category* || *duration* ||
|| 1 || 1 ||
|| 2 || 2 ||
|| 3 || 4 ||
|| 4 || 6 ||

接下来,您需要将该查找表连接到您的 books 表,就像这样。此查询还可以包含一个 expiration 列,如图所示。

select b.*,
d.duration,
FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration
from books b
join (select 1 as category, 1 as duration UNION ALL
select 2,2 UNION ALL select 3,4 UNION ALL select 4,6
) d ON b.category = d.category

最后,您附加一个 WHERE 子句来过滤掉未过期的行。

select b.*,
d.duration,
FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration
from books b
join (select 1 as category, 1 as duration UNION ALL
select 2,2 UNION ALL select 3,4 UNION ALL select 4,6
) d ON b.category = d.category
where FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR >= '2016-02-03 08:00:00'

在此示例中,我使用 2016-02-03 08:00:00 作为当前时间。您可以在生产系统中使用 NOW()

你也可以聪明地使用 sargable where 子句的版本。

   where unix_time >= UNIX_TIMESTAMP('2016-02-03 08:00:00' - INTERVAL d.duration HOUR)

最后,这是一种设计偏好,但混合使用 DATETIME 和 unix 时间戳列有点奇怪。

关于mysql - 根据到期时间获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com