MySql查询子集

时间:2013-04-18 20:13:20

标签: php mysql

我有一个MySQL问题。我有一个包含三列的表:'salesdate'(包含日期),'salestime'(包含时间)和'剩余'(包含整数)。该表包含过去和将来的日期。我想从“剩余”中选择一个最接近当前日期和时间的值。

我已经构建了下面的查询,但它只选择日期和时间值都为真的值。这可能会产生错误的结果,因为在'salesdate'中可能存在昨天日期的行,但所有'salestime'值都大于当前时间 - 所以我当前的查询会忽略这些......即使它们是最接近的到当前日期/时间。

我当前的查询:

$result = mysql_query(
"SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
ORDER BY salesdate DESC
LIMIT 1 ");

我认为我需要做的是先查询日期然后以某种方式过滤此列表以显示最接近当前时间的日期/时间?但怎么样?如果你能提供帮助 - 我已经搜索过,无法找到明确的,一步一步的方法来做到这一点。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

  

最接近当前时间?

第一个问题是您的数据设计错误。如果时间和日期都引用同一事件,则信息由单个日期时间字段表示 - 而不是2个单独的日期时间字段。因此,您对此数据运行的任何查询都将非常低效。

此外,从您的描述中不清楚salesdate +时间是否可能在将来。

所以使用你当前的架构:

SELECT remaining 
FROM quantity_time  
ORDER BY ABS(NOW() - timestamp(salesdate,salestime)) DESC
LIMIT 1

术语“剩余”意味着您使用它来确定库存水平 - 这意味着您的架构非常错误。表示股票和交易的正确方法是通过2个独立的实体(表格)。

答案 1 :(得分:0)

SELECT remaining FROM (
SELECT remaining,
(UNIX_TIMESTAMP(salesdate) - UNIX_TIMESTAMP()) AS difference
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME()
) subquery
ORDER BY difference DESC
LIMIT 1

我不知道这是否非常有效,但这至少应该有效。它首先创建一个子查询,它以秒为单位计算时间差,然后按差异排序。

答案 2 :(得分:0)

与当前日期时间最接近的是什么意思?

放一些范围,我不知道应该有多准确,但是:

SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime BETWEEN date_sub(NOW(), INTERVAL 24 HOUR) AND date_add(NOW(), INTERVAL 24 HOUR)
ORDER BY salesdate DESC
LIMIT 1