在意识到您正在寻找特定于 mySQL 的解决方案之前,我开发了一个适用于 SQL Server 的答案。但是,我无权访问 mySQL 实例来验证语法 - 我确信它仍然坏了,但真的很接近它应该是的。我很确定 searchDate 连接失败,因此假设语法已更正,将返回意外结果。
此解决方案假定您的源表名为thoughts,重要的列是ThoughtID 和ThoughtTime。显然,您需要根据需要对其进行自定义:
SQL 服务器:
DECLARE @Results TABLE (
ThoughtID int,
ThoughtTime datetime)
DECLARE @date date
DECLARE @minResults int
DECLARE @totResults int
SET @minResults = 100
SET @totResults = (SELECT COUNT(1) FROM thougts)
SET @date = CONVERT(CHAR(4), YEAR(GETDATE()), 100) + '-' + CONVERT(CHAR(2), MONTH(GETDATE()),120) + '-01'
IF @totResults <= @minResults
BEGIN
-- Not enough results, grab everything
SELECT ThoughtID, ThoughtTime
FROM thougts
ORDER BY ThoughtTime DESC
END ELSE
BEGIN
WHILE (SELECT COUNT(1) FROM @Results) < @minResults
BEGIN
DELETE FROM @Results -- Can be optimized
SET @date = DATEADD(m, -1, @date)
INSERT INTO @Results (ThoughtID, ThoughtTime) (
SELECT ThoughtID, ThoughtTime
FROM thougts
WHERE ThoughtTime >= @date)
END
SELECT *
FROM @Results
ORDER BY ThoughtTime DESC
END
mySQL(未经测试,需要改进):
CREATE PROCEDURE TEST()
BEGIN
CREATE TEMPORARY TABLE Results (
ThoughtID int,
ThoughtTime datetime);
DECLARE searchDate date;
DECLARE minResults int;
DECLARE totResults int;
SET minResults = 100;
SET totResults = (SELECT COUNT(1) FROM thougts);
SET searchDate = CONVERT(YEAR(CURRENT_TIMESTAMP()), CHAR(4)) + '-' + CONVERT(MONTH(CURRENT_TIMESTAMP()), CHAR(2)) + '-01';
IF totResults <= minResults
THEN
SELECT ThoughtID, ThoughtTime
FROM thougts
ORDER BY ThoughtTime DESC;
ELSE
WHILE (SELECT COUNT(1) FROM Results) < minResults DO
DELETE FROM Results; -- Can probably be optimized
SET searchDate = DATE_SUB(searchDate, INTERVAL 1 MONTH);
INSERT INTO Results (ThoughtID, ThoughtTime) (
SELECT ThoughtID, ThoughtTime
FROM thougts
WHERE ThoughtTime >= searchDate);
END WHILE;
SELECT *
FROM Results
ORDER BY ThoughtTime DESC;
END IF;
)
END
如果我在接下来的几天内可以访问一个 mySQL 实例,我会尝试更多地清理它。否则,希望其他 SO 用户可以看看。