Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Cykliczność wdarzeń
lukaszgolder
post 16.02.2010, 14:56:21
Post #1





Grupa: Zarejestrowani
Postów: 141
Pomógł: 17
Dołączył: 2.04.2008
Skąd: z Zabrza

Ostrzeżenie: (0%)
-----


Mam w bazie danych tabele z wydarzeniami, niektóre z nich są cykliczne (co tydzień, co 2 tygodnie lub co miesiąc), a niektóre jednorazowe.

Chcę pobrać zbliżające się imprezy i posortować je od tych najbliższych do tych najdalszych.

Ma ktoś pomysł jak to zrobić?
Go to the top of the page
+Quote Post
muniekw
post 16.02.2010, 15:04:03
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


A może powiesz mniej więcej jak wygląda tabelka z wydarzeniami bo na przykładzie to raczej łatwiej jest coś wymyślić.
Go to the top of the page
+Quote Post
lukaszgolder
post 16.02.2010, 15:22:14
Post #3





Grupa: Zarejestrowani
Postów: 141
Pomógł: 17
Dołączył: 2.04.2008
Skąd: z Zabrza

Ostrzeżenie: (0%)
-----


Tabela może wyglądać dowolnie, póki co wygląda tak:
  1. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  2. `club_id` int(10) UNSIGNED NOT NULL,
  3. `name` varchar(64) NOT NULL,
  4. `datetime` datetime NOT NULL,
  5. `image` varchar(64) NOT NULL,
  6. `desc` text NOT NULL,
  7. `calendar_name` varchar(20) NOT NULL,
  8. `calendar_image` tinyint(1) NOT NULL DEFAULT '0',
  9. `calendar_recurrent` float NOT NULL,
  10. PRIMARY KEY (`id`)
Go to the top of the page
+Quote Post
muniekw
post 16.02.2010, 15:35:00
Post #4





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Rozumiem, że calendar_recurrent określa cykliczność wydarzeń.
Możesz użyć CASE
np:
  1. SELECT (
  2. CASE
  3. WHEN (auction_type = 'bidding' OR auction_price_bid > auction_price_buynow)
  4. THEN auction_price_bid
  5. ELSE auction_price_buynow
  6. END) AS auction_price


Przykład akurat z aukcji internetowej.
Go to the top of the page
+Quote Post
lukaszgolder
post 17.02.2010, 11:02:24
Post #5





Grupa: Zarejestrowani
Postów: 141
Pomógł: 17
Dołączył: 2.04.2008
Skąd: z Zabrza

Ostrzeżenie: (0%)
-----


Zrobiłem coś takiego, ale to nie do końca działa tak jak powinno.
  1. SELECT (
  2.  
  3. CASE WHEN (
  4. `Event`.`calendar_recurrent` = 0.25
  5. )
  6. THEN TIMESTAMPADD( WEEK, CEIL( (
  7. UNIX_TIMESTAMP( ) - UNIX_TIMESTAMP( `Event`.`datetime` ) ) /604800 ) , `Event`.`datetime`
  8. )
  9. WHEN (
  10. `Event`.`calendar_recurrent` = 0.5
  11. )
  12. THEN TIMESTAMPADD( WEEK, CEIL( (
  13. UNIX_TIMESTAMP( ) - UNIX_TIMESTAMP( `Event`.`datetime` ) ) /1209600 ) *2, `Event`.`datetime`
  14. )
  15. WHEN (
  16. `Event`.`calendar_recurrent` =1
  17. AND MONTH( NOW( ) ) <10
  18. )
  19. THEN CONCAT( YEAR( NOW( ) ) , "-", "0", MONTH( NOW( ) ) , "-", DATE_FORMAT( `Event`.`datetime` , "%d %H:%i:%s" ) )
  20. ELSE CONCAT( YEAR( NOW( ) ) , "-", MONTH( NOW( ) ) , "-", DATE_FORMAT( `Event`.`datetime` , "%d %H:%i:%s" ) )
  21. END
  22. ) AS `newdatetime` , `Event`.`id` , `Event`.`name` , `Event`.`image` , `Event`.`desc` , `Club`.`name`
  23. FROM `events` AS `Event`
  24. LEFT JOIN `clubs` AS `Club` ON ( `Event`.`club_id` = `Club`.`id` )
  25. WHERE (
  26. (
  27. `Event`.`datetime` > NOW( )
  28. )
  29. OR (
  30. `Event`.`calendar_recurrent` >0
  31. )
  32. )
  33. ORDER BY `newdatetime` ASC
  34. LIMIT 4


Generalnie chodzi o to, że ma pobrać z bazy danych najbliższe imprezy (bez tych co już się odbyły), no i posortować je od najbliższych do najdalszych. W przypadku imprez cyklicznych musi sobie obliczyć nową datę tej imprezy, no ale nie jak wrzucam newdatetime do warunku to mi wyskakuje błąd że nie ma takiego pola. Jak chcę dać AS `Event`.`newdatetime` to też wyskakuje błąd.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 03:31