Autor Zpráva
WMPopi
Profil
Ahoj, řeším takový zajímavý problém: mám tabulku akce, kde mám sloupce datum_od a datum_do. Občas se stane, že akce netrvá od-do, ale je jen 1., 3. a 5. Pro tenhle účel mám další tabulku akce_konani (id, akce, datum) a tam se rozepíšou jednotlivé dny.

Ve skriptu potřebuju vypsat každý den, ve který se něco koná, co se koná. Potřebuju dostat takovýhle výsledek:

2011-01-01: Akce jednodenní
2011-01-01: Akce vícedenní
2011-01-01: Akce některé dny

2011-01-02: Akce vícedenní

2011-01-03: Akce vícedenní
2011-01-03: Akce některé dny

2011-01-04: Akce vícedenní

2011-01-05: Akce vícedenní
2011-01-05: Akce některé dny



CREATE TABLE IF NOT EXISTS `akce` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nazev` varchar(100) NOT NULL,
  `typ` enum('jednodenní','vícedenní','různé dny') NOT NULL,
  `datum_od` date NOT NULL,
  `datum_do` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `akce` (`id`, `nazev`, `typ`, `datum_od`, `datum_do`) VALUES
(1, 'Jednodenní akce', 'jednodenní', '2012-01-01', '2012-01-01'),
(2, 'Vícedenní akce', 'vícedenní', '2012-01-01', '2012-01-05'),
(3, 'Akce různé dny', 'různé dny', '0000-00-00', '0000-00-00');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `akce_konani` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `akce` int(11) NOT NULL,
  `datum` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `akce_konani` (`id`, `akce`, `datum`) VALUES
(1, 3, '2012-01-01'),
(2, 3, '2012-01-03'),
(3, 3, '2012-01-05');


Nenapadne vás někoho něco? Zkoušel pokusy seskupení s union, ale nic mi nevyšlo. Nyní to mám vyřešený tak, že mám cyklus for, procházím den za dnem na 30 dní dopředu a ptám se obou tabulek, jestli v nich v ten den něco není.. Děkuji a těším se na případné nápady, tedy pokud to je vůbec nějak jinak řešitelné.
Tori
Profil
Nevím, jestli to je použitelné, ale napadlo mne: Prvním dotazem bych načetla vícedenní a jednodenní akce a druhým (s INNER JOIN) ty s výběrem dní. Ukládalo by se to do pole ve tvaru:
2011-01-01 => Array (
  [0] => Array (1, Akce jednodenní)
  [1] => Array (2, Akce vícedenní)
  [2] => Array (3, Akce některé dny)
),
2011-01-02 => Array (
 [0] => Array(2, Akce vícedenní)
) ..atd.
Pak jen seřadit pole podle klíče a vypsat. U vícedenních akcí by se při ukládání do pole musel použít další malý cyklus, kterým by se akce uložila pod všechny data.
Kajman_
Profil *
Šlo by to tak, že v db bude i tabulka s kalendářem, ale optimálnější bude při výpisu položky uložit delší akce v php do pole a při dalších dnech projet i tohle pole, kde se vypíšou ty, které do toho ještě spadají, a smáznou se z pole ty, které už nebudou třeba.
WMPopi
Profil
Děkuji vám, ale pole mi na tohle nepřijdou moc pohodlná a moc zátěže tím neušetřím. Nechám tam ten cyklus. Při návštěvnosti 100/den a počtu akcí v řádu desítek to asi nemá smysl řešit..
Kajman_
Profil *
WMPopi:
A varianta s kalendářovou tabulkou Vám také nepřijde pohodlná?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0