Логика запросов MySQL для выборки постов по датам - PullRequest
1 голос
/ 26 декабря 2011

Может кто-нибудь предложить предложения по логике в запросе MySQL, который выполняет следующие действия:

  • Выбирает не менее 100 сообщений
  • Выбирает все сообщения за последний месяц загрузкинапример, если 100 сообщений загружают сообщения в середине сентября, то следует загружать сообщения за весь сентябрь, а не обрезать их наполовину.

К сожалению, второй вариант нечто-то, что я знаю, возможно даже с MySQL, поэтому я обращаюсь за небольшой помощью.

Приветствия.

Ответы [ 2 ]

1 голос
/ 26 декабря 2011

просто вычислите месяц сотой строки в подзапросе и используйте значение в условии МЕЖДУ

Что вам в основном нужно:

  • найти дату 100-й строки (date_a)
  • найти первый день месяца date_a (date_b)
  • найти все строки, которые новее, чем date_b

Таким образом,

SELECT created as date_a
FROM posts
ORDER BY created DESC
LIMIT 99, 1

SELECT
  (LAST_DAY(created) + INTERVAL 1 DAY - INTERVAL 1 MONTH) as date_b
FROM posts
ORDER BY created DESC
LIMIT 99, 1

Последний запрос, где последний используется в качестве подзапроса, является вашей домашней работой =)

0 голосов
/ 27 декабря 2011

Я разработал ответ, который работает в 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 может взглянуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...