Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Cykliczność wdarzeń
Forum PHP.pl > Forum > Przedszkole
lukaszgolder
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ć?
muniekw
A może powiesz mniej więcej jak wygląda tabelka z wydarzeniami bo na przykładzie to raczej łatwiej jest coś wymyślić.
lukaszgolder
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`)
muniekw
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.
lukaszgolder
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.