Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Webmaster Zone > Web Development
Register

Reply
 
LinkBack Thread Tools
Old 12.09.2007, 22:01   #1
инсценирующи
 
[ Xelgen ]'s Avatar
 
Join Date: 07 2002
Location: Fireplace of Ecotopia
Age: 31
Posts: 4,327
Downloads: 22
Uploads: 0
Reputation: 193 | 4
Default [Help Needed] SQL Request. Getting each day of date period.

I have, a table containing events, and need to show them up in a calendar, for a month.

Here is the table I have.
Code:
1.
+------+--------------------+-------------------+------------+
|   id |         start_date |           end_date|      text  |
+------+--------------------+-------------------+------------+
|    1 | 2007-09-12 00:00:00|2007-09-12 23:59:59| Party      |
|    2 | 2007-09-13 00:00:00|2007-09-13 23:59:59| Concert    |
|    3 | 2007-09-13 00:00:00|2007-09-17 23:59:59| Festival   |
|    4 | 2007-09-15 00:00:00|2007-09-15 23:59:59| Exhibition |
|    5 | 2007-09-16 00:00:00|2007-09-16 23:59:59| Shooting   |
+------+--------------------+-------------------+------------+
I'd like to get, smth like.

Code:
2
+------+-----------+
|  day |    Text   |
+------+-----------+
|    12| Party     |
|    13| Concert   |
|    13| Festival  |
|    14| Festival  |
|    15| Festival  |
|    15| Exhibition|
|    16| Festival  |
|    16| Shooting  |
|    17| Festival  |
+------+-----------+
Do you have ideas, how this can be done?
Order, doesn't really matter, currently. So you can ignore, this as well as the time part of DATETIME.

Ideally, I need, to get, smth like :

Code:
 3
+------+--------------------------+
|  day |    Text                  |
+------+--------------------------+
|    12| Party                    |
|    13| Concert <br> Festival    |
|    14| Festival                 |
|    15| Festival <br> Exhibition |
|    16| Festival <br> Shooting   |
|    17| Festival                 |
+------+--------------------------+
But, I can do this with php, if i'd get the second table.

First table could also be done, through php, but I'd prefer to do it with MySQL, rather then processing "raw data" with PHP.
I'm sure this all can be done though MySQL, but i'm just out of ideas.
__________________
...ибо...
Rgrdz. [ Кселджэн ]
Reply With Quote
Old 13.09.2007, 13:21   #2
Главный Лысый
 
Pascal's Avatar
 
Join Date: 10 2001
Location: AM
Age: 39
Posts: 2,829
Downloads: 4
Uploads: 0
Reputation: 28 | 4
Default

Поиграйся с group by dayofmonth(start_date).
Что то типа select dayofmonth(start_date), text group by dayofmonth(start_date)

Если нужна добавка и месяца то
select month(start_date), dayofmonth(start_date), text group by month(start_date), dayofmonth(start_date)


Должно работать для мускула. Про другие движки не знаю.
Reply With Quote
Old 13.09.2007, 20:54   #3
инсценирующи
 
[ Xelgen ]'s Avatar
 
Join Date: 07 2002
Location: Fireplace of Ecotopia
Age: 31
Posts: 4,327
Downloads: 22
Uploads: 0
Reputation: 193 | 4
Default

Сделал, это через пхп, так как дизайнеру, нужна была большая степень свободы в шаблоне, и там уже полюбому нужно было, лопатить массивы, так что делать это в двух местах глупо.

Но вопрос остается, тут загводка в том, как средствами ДБ из диапазона типа 2007-09-10 2007-09-15 получить, 6 строк, с датой каждого дня. тут как раз нужен какой-нибудь ungroup, а не group
Либо каким то еще макаром заставить выводить его, одну и ту же запись, несколько раз.
Остается еще изврат с созданием временной таблицы с перечнем всех дней месяца, но тут овчинка уже ни по одному критерию, не стоит выделки.
Reply With Quote
Old 13.09.2007, 23:38   #4
4294967296
 
Boyov's Avatar
 
Join Date: 03 2002
Location: /proc/1
Age: 33
Posts: 379
Downloads: 4
Uploads: 0
Reputation: 0 | 0
Default

This should help I guess:

http://dev.mysql.com/doc/refman/5.0/en/regexp.html
Reply With Quote
Old 14.09.2007, 05:33   #5
Младенец
 
Join Date: 06 2002
Location: Armenia, Yerevan
Posts: 34
Downloads: 2
Uploads: 0
Reputation: 5 | 0
Lightbulb

Quote:
Originally Posted by [ Xelgen ] View Post
Сделал, это через пхп, так как дизайнеру, нужна была большая степень свободы в шаблоне, и там уже полюбому нужно было, лопатить массивы, так что делать это в двух местах глупо.

Но вопрос остается, тут загводка в том, как средствами ДБ из диапазона типа 2007-09-10 2007-09-15 получить, 6 строк, с датой каждого дня. тут как раз нужен какой-нибудь ungroup, а не group
Либо каким то еще макаром заставить выводить его, одну и ту же запись, несколько раз.
Остается еще изврат с созданием временной таблицы с перечнем всех дней месяца, но тут овчинка уже ни по одному критерию, не стоит выделки.
Ինչքան գիտեմ MySQL-ը նման խնդրի լուծման համար ստանդարտ մեթոդներ չունի.
Օրինակ MSSQL-ի մեջ ռեկուրսիվ կանչերով նման բան կարելի է սատանալ:
Համենայն դեպս MySQL-ի համար, ժամանակավոր table օգտագործելով կարելի է էդ խնդիրը լուծել, բայց թե որքանով է դա հարմար, կախված է քո պահանջներից:


Quote:
CREATE TABLE `t1` (
`id` int(11) NOT NULL auto_increment,
`d1` date NOT NULL,
`d2` date default NULL,
`event` varchar(20) default NULL,
PRIMARY KEY (`id`),
KEY `d1` (`d1`,`d2`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


SET @v=0;
DROP TABLE IF EXISTS TMP;
CREATE TEMPORARY TABLE TMP(a int not null AUTO_INCREMENT,KEY(a));
INSERT INTO TMP VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);

SELECT a.d1, a.event, 0 FROM t1 AS a
UNION
SELECT ADDDATE(a.d1, @v+1), a.event, @v:[email protected]+1
FROM t1 AS a
LEFT JOIN TMP AS T ON a.d1<>T.a AND @v<(a.d2-a.d1)
WHERE a.d1<a.d2;

--DROP TABLE TMP;
Reply With Quote
Old 17.09.2007, 04:41   #6
Академик
 
Join Date: 01 2002
Location: Shambala
Age: 38
Posts: 7,015
Downloads: 11
Uploads: 0
Reputation: 267 | 5
Default

Rekurskia chka MySQL um ed hastat, ORacle um ka, MS SQL um el, baycMySQL um chka u ed nshanakuma ed xndri lucman hamar miak tarberak zamanakavor axusyaki ogtagorcumna
Reply With Quote
Old 12.11.2007, 21:35   #7
наивная дурочка
 
TasteMyLipstick's Avatar
 
Join Date: 10 2005
Location: бродяжка я
Age: 33
Posts: 196
Downloads: 0
Uploads: 0
Reputation: 25 | 3
Default

Lorem ipsum dolor sit amet.
Reply With Quote
Old 13.06.2008, 12:36   #8
Младенец
 
Join Date: 06 2008
Location: -
Posts: 3
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Если вам так принципиально нужно сделать это в код SQL, используете MySQL версии 5 и выше. Этот сервер поддерживает хранимые процедуры.
В них доступны if/then/else, case, while, repeat, loop, goto
Напишите процедуру и вызывайте её.

Впрочем это будет работать медленее чем PHP. Подумайте насчет написать функцию PHP которая будет слоем абстракции между SQL вызовом и остальым кодом PHP. (Т.е. она тянет из БД данные, обрабатывает и выдает нужный вам массив).
Reply With Quote
Old 10.07.2008, 13:27   #9
Школьник
 
Fox's Avatar
 
Join Date: 11 2005
Location: AM
Posts: 178
Downloads: 0
Uploads: 0
Reputation: 15 | 3
Default

v MSSQL est super vesh PIVOT ochen udobno budet dlia vivedenia
otcheta po dniam mesiaca esli eti dni iavliautsia stolbikami

naskolko ponial eto 2-aia chas zadania

temp table legko mojno ispolzovat v procedure
est 2 vida temp tableov

#table i @table
mejdu nimi bolshaia raznica

i mojno ispolzovat v razlichnikh procedurakh daje v rekursii
__________________
Если в слове "жена" сделать 4 ошибки, получится "пиво"

{Barracuda} Online Intellectual Games Club
http://www.Explorer.am - Explore Armenia!
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 15:08.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.