我需要从一个表中选择一个具有“最高”日期和时间的行,但是我无法得到最高的一个,DESC的命令不起作用。以下是我的查询:
SELECT count(*) as c,
start,
UNIX_TIMESTAMP(start) as S,
duration
FROM appuntamento
WHERE DATE(start) = DATE('2014-04-08 18:30:00')
ORDER BY S DESC
LIMIT 1我不关心在unix时间戳中获得起始值,而是第n次尝试通过这个
有小费吗?
发布于 2014-03-27 16:41:05
这里有几个问题。首先,COUNT(*)的存在将它转化为聚合查询,这是您不想要的。这可能是你麻烦的原因。
其次,如果您的appuntamento表中有很多行,则此查询的性能将很差,因为您不能使用索引。
假设您想要表中某一天的最后一行(最新的时间)的时间和持续时间,以及同一天的约会次数,则需要这样做:
SELECT a.start, a.duration, b.count
FROM (
SELECT start,
duration
FROM appuntamento
WHERE start >= DATE('2014-04-08 18:30:00')
AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY
ORDER BY start DESC, duration DESC
LIMIT 1
) AS a
JOIN (
SELECT COUNT(*) AS count
FROM appuntamento
WHERE start >= DATE('2014-04-08 18:30:00')
AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY
) AS b说明:首先,这种形式的start搜索允许您在start列上使用索引。你想这么做是出于表现上的原因。
WHERE start >= DATE('2014-04-08 18:30:00')
AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY其次,您需要将COUNT(*)作为一个单独的子查询处理。我已经做过了。
第三,您肯定可以执行ORDER BY start DESC,如果start是DATETIME列,它就能工作。不需要UNIX_TIMESTAMP()。
第四,如果碰巧有几个时间相同的ORDER BY start DESC, duration DESC,我就使用start来安排返回最长的约会。
发布于 2014-03-27 16:31:44
如果您只需要返回一行,那么就使用MAX()函数,而不使用订单。应该能起作用。
SELECT count(*) as c,
MAX(start) as highest_date,
UNIX_TIMESTAMP(start) as S,
duration
FROM appuntamento
WHERE DATE(start) = DATE('2014-04-08 18:30:00') 还有你的陈述定单。您需要添加一个组,这样就不会将不正确的行与COUNT()聚合组合起来。
SELECT count(*) as c,
start,
UNIX_TIMESTAMP(start) as S,
duration
FROM appuntamento
WHERE DATE(start) = DATE('2014-04-08 18:30:00')
GROUP BY S
ORDER BY S DESC
LIMIT 1https://stackoverflow.com/questions/22693458
复制相似问题