Я пропущу "почему" для краткости. Но если вы хотите знать, вы можете спросить. Но в основном мой первый квест заключался в том, чтобы найти способ подсчета всех строк, предшествующих текущему месяцу. Я нашел решение этого, которое работает:
SELECT COUNT(*) FROM myTable
WHERE log_date < (CURDATE() - DAYOFMONTH(CURDATE()))
Я просто вычитаю количество дней, которые произошли в этом месяце, и подсчитайте все строки с датой меньше, чем в первый день этого месяца.
Следующая проблема заключается в том, что мне нужно пересчитать все строки до последнего месяца. Я предполагаю, что технически я мог бы взять мой результат выше и запросить результаты за последний месяц и вычесть два запроса. Но я надеялся на один запрос для этого. Я попробовал варианты двух версий ниже:
SELECT COUNT(*) FROM myTable
WHERE log_date < ((CURDATE()- DAYOFMONTH(CURDATE())) - INTERVAL 1 MONTH)
и
SELECT COUNT(*) FROM myTable
WHERE log_date < DATE_SUB((CURDATE()- DAYOFMONTH(CURDATE())), INTERVAL 1 MONTH)
Оба этих подхода вместе с некоторыми вариациями этого я попытался получить результат 0, когда я знаю, что ответ должен быть 14.
Есть ли способ получить ответ, который я ищу в одном запросе?
Спасибо.
Я нашел решение. Спасибо, goreSplatter и ajreal и dcestari за вас, и помогли мне продумать это. Вот рабочий запрос:
$query = mysql_query("SELECT
SUM(IF(log_date<(CURDATE()-DAYOFMONTH(CURDATE())),1,0)) AS LAST_MONTH,
SUM(IF(log_date<DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY),1,0)) AS PREV_MONTH
FROM myTable WHERE member_id = '$mid'")or die(mysql_error());
Для расчета PREV_MONTH я вернулся два месяца, получил последний день этого месяца и добавил один день, чтобы получить первый день последнего месяца. Похоже, если у них есть "LAST_DAY", у них также будет функция "FIRST_DAY".
Надеюсь, это поможет кому-то помочь.
Хорошо, я думаю, что получаю то, что вы хотите.
У вас есть 2 даты и требуется COUNT
для записей перед каждой датой.
SELECT
SUM(IF(log_date<DATESUB(CURDATE()-DAYOFMONTH(CURDATE())), 1, 0)) AS LAST_MONTH,
SUM(IF(log_date<DATE_SUB((CURDATE()-DAYOFMONTH(CURDATE())),INTERVAL 1 MONTH),1,0)
AS PREV_MONTH
FROM ....
WHERE log_date < DATESUB(CURDATE() - DAYOFMONTH(CURDATE()));
Таким образом, у вас есть 2 эмулированных COUNT
с помощью SUM
в сочетании с IF
.
Я предполагаю, что вы используете MySQL, но это может работать на других СУБД
Надеюсь, это поможет!
Попробуйте следующее:
SELECT COUNT(*) FROM `myTable` WHERE `log_date` BETWEEN "2010-11-01 00:00:00" AND "2010-11-30 23:59:59"