Я разработал ответ, который работает в SQL Server, прежде чем понял, что вы ищете решение для mySQL.Тем не менее, у меня нет доступа к экземпляру mySQL для проверки синтаксиса - я уверен, что он все еще не работает, но очень близко к тому, что должно быть.Я уверен, что конкатенация searchDate завершится неудачно и, следовательно, выдаст неожиданные результаты, если синтаксис исправлен.
В этом решении предполагается, что исходная таблица называется thoughts
, а важными столбцами являются ThoughtID
и ThoughtTime
.Очевидно, вы захотите настроить это по мере необходимости:
SQL Server:
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 может взглянуть.