Консультация № 38080
21.03.2006, 09:36
0.00 руб.
0 4 3
Уважаемые эксперты!
В таблице храниться статья и дата(строка вида: "02.11.2006").
Подскажите, каким образом с помощью запроса MySQL показать все статьи, принадлежащие каждому из месяцев 2006 года. Заранее спасибо за помощь!

Обсуждение

Неизвестный
21.03.2006, 10:04
общий
это ответ
Здравствуйте, Андрющенко Вячеслав Васильевич!
Например так:
select * from articles where substring(date,4)=‘11.2006‘
Но вообще-то хранить дату в таком виде, да еще потом делать по ней выборку - это совсем не хорошо.
Неизвестный
21.03.2006, 10:29
общий
Я бы сделал немного иначе, нежели предложил Straight:SELECT * FROM table_name WHERE date_column LIKE ‘%.11.2006‘;P.S.: вопрос не в ту рассылку отправили. Здесь обсуждаются вопросы программирования на PHP. Для вопросов, касаемых языка SQL есть своя рассылка.
Неизвестный
21.03.2006, 13:56
общий
это ответ
Здравствуйте, Андрющенко Вячеслав Васильевич!
если у вас дата хранится в таком формате то практически никак.
хотя есть 2 варианта
1 прочитать всю базу в массив и уж потом в массиве сделать поиск substr() или strpos()
2 сгенерировать все дни в цикле и пришить к where (where dat=‘01.01.2006‘ or dat=‘02.01.2006‘ ....)
если есть возможность переделайте тип этого поля
потому что так вам труднее будет
Неизвестный
21.03.2006, 18:39
общий
это ответ
Здравствуйте, Андрющенко Вячеслав Васильевич!
как уже было сказано, при таком формате поля- невозможно.
Я лично предпочитаю хранить дату/время в timestamp. Можно сделать поле в БД или типа timestamp или int(14) или, например, varchar(14). Туда пишем то что возвращает time(). Потом берешь генерируешь timestamp для 00:00:00 - 01.01.2006 и для 23:59:59 - 31.12.2006. Выбираешь все что между этими двумя значениями элементарным сравнением через ">" и "<".
Минус этого варианта - нужны преобразования времени в timestamp и обратно. Плюс - получешь ВСЕ возможные данные о времени. И очень удобно сравнивать даты. Кстати, не забудь в запросе указать ORDER BY time, чтобы сортировака шла по полу времени и выведены были в хронологическом порядке. Если наоборот, т.е. от послденего, тогда ORDER BY time desc

Другой вариант. 3 поля:
Day int(2)
Month int(2)
Year int(4)
Пишешь туда день, месяц, год. Потом пишешь запрос:
SELECT *
FROM твоя_таблица
WHERE Year=2006

А дальше можно бдувя способами:

Либо через ORDER BY Month, Day, тогда будет отсортировано по месяцам, в хронологическом порядке. При совпадении месяцев будет идти сортировка по дням, тоже в хронологическом порядке (по возрастанию). Если нужно по убыванию - добавлешь desc и все.

Другой вариант, который в данном случае не имеет никаких преимуществ:
GROUP BY Month - бубут выбраны все записи для 2006 года и сгруппированы по месяцам.
GROUP BY не имеет смысла, если нет никаких операция агрегирования данных (не подсчитывается сумма, не считается количество и т.п.)

Если это извлечение нужно только для подсчет кол-ва статей, тогда:
SELECT Month, count(*) AS NumArticles [или count(ID), если ID не пустой]
FROM your_table
WHERE Year=2006
GROUP BY Month
В результате получится запрос из 2 полей:
Month и NumArticles, в строках будут месяцы и кол-во статей в них.
Вот только если месяца, пример, 5 нет, то и строки
+------+------------+
|Month | NumArticles|
+------+------------+
| 5 | 0 |
+------+------------+
Тоже не будет.

Итого:
Первый способ - если нужно извлечь и показать
Второй - если выводить статистику, потому что считать это все через MySQL удобнее, чем через php, если знаь SQL, конечно. А его знать очень советую.
Форма ответа