Autor Zpráva
stepanka
Profil *
Ahoj,

poradil by mi někdo prosím s jedním těžším dotazem? Už s ním válčím asi hodinu.

Mám tuto tabulku:
TABLE `program` (
  `programID` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `time` time NOT NULL,
  PRIMARY KEY (`programID`)
)


A v ní pro každý den cca 20 záznamů, například:
(1, 'Pojďte pane, budeme si hrát', '2011-03-15', '06:30:00')
(2, 'Čertík Lucifuk', '2011-03-15', '07:00:00')
(3, 'Požár v Kocourkově', '2011-03-15', '07:30:00')


Potřebovala bych vybrat aktuální 4 pořady, tzn. ten co běží teď, jeden před ním a dva co budou následovat.

Posílám kostru dotazu, raději ji osekám o moje neúspěšné pokusy:

$date = date('Y-m-d');
SELECT A.programID, A.title, A.time
FROM program A  
WHERE A.date = '$date'
GROUP BY A.programID
ORDER BY A.date ASC, A.time ASC


Nevěděl by někdo, jak na to?
Moc děkuju!
Kajman_
Profil *
$date = date('Y-m-d');
$time = date('G:i');

(SELECT A.programID, A.title, A.time, A.date
FROM program A  
WHERE A.date > '$date' OR (A.date = '$date' AND A.time > '$time')
ORDER BY A.date ASC, A.time ASC
LIMIT 2)
UNION ALL
(SELECT A.programID, A.title, A.time, A.date
FROM program A  
WHERE A.date < '$date' OR (A.date = '$date' AND A.time <= '$time')
ORDER BY A.date DESC, A.time DESC
LIMIT 2)
ORDER BY `date`, `time`


Když by to bylo pomalé i s indexem (date,time), tak bych do where přidal ještě podmínku, že to date je v (včera,dnes,zitra) - snad je každý den aspoň pár pořadů.
stepanka
Profil *
Kajman:
Mockrát děkuju, zachránil jsi mě. Akorát to řazení jsem přehodila, a vybírá to data úplně perfektně.

(SELECT A.programID, A.title, A.time, A.date
FROM program A  
WHERE A.date > '$date' OR (A.date = '$date' AND A.time > '$time')
ORDER BY A.date DESC, A.time DESC
LIMIT 2)
UNION ALL
(SELECT A.programID, A.title, A.time, A.date
FROM program A  
WHERE A.date < '$date' OR (A.date = '$date' AND A.time <= '$time')
ORDER BY A.date ASC, A.time ASC
LIMIT 2)
ORDER BY `date`, `time`
stepanka
Profil *
Kajman:
Vlastně program musí být vždy dnešní, tzn. že jsem smazala ty první částí podmínky WHERE, a je to super. Akorát se to snažím ještě upravit tak, aby:
- pokud neexistuje žádný pořad před aktuálním (běží první pořad z dnešního dne), mělo by to vybrat stále 4 položky, 1 aktuální pořad, 3 po něm.
- pokud neexistuje žádný pořad po aktuálním (běží poslední pořad dnešního dne), mělo by to vybrat stále 4 položky, 1 aktuální, 3 před ním.

Nepomohl bys mi, prosím, ještě s tímto?
Kajman_
Profil *
stepanka:
Akorát to řazení jsem přehodila, a vybírá to data úplně perfektně.

Pokud jsi nepřehodila i < a >, tak mi tu opravu hlava nebere.

Jestli nebyla spíš chyba ve špatně předpokládaném přetypování u toho time. Možná bude lepší.
$time = date('H:i:00');


Nepomohl bys mi, prosím, ještě s tímto?
Tak to bych si udělal zvlášť ty dva dotazy vždy s limit 4 a podle vrácených řádků, bych se v php rozhodl, kolik ze kterého dotazu se má vypsat.
stepanka
Profil *
Kajman:
Pokud jsi nepřehodila i < a >, tak mi tu opravu hlava nebere.
Nepřehodila, ale opravdu to až teď řadí správně. Ten Tvůj dotaz vybral dva úplně první ranní pořady ze dne, plus dva pořady z úplného konce dne. Teď vypadá takto, a vypisuje to správně:

(SELECT A.programID, A.originalProgramID, A.title, A.time, A.date
FROM program A  
WHERE A.date = '$date' AND A.time > '$time'
ORDER BY A.date ASC, A.time ASC
LIMIT 2)
UNION ALL
(SELECT A.programID, A.originalProgramID, A.title, A.time, A.date
FROM program A  
WHERE A.date = '$date' AND A.time <= '$time'
ORDER BY A.date DESC, A.time DESC
LIMIT 2)
ORDER BY date, time


Tak to bych si udělal zvlášť ty dva dotazy vždy s limit 4 a podle vrácených řádků, bych se v php rozhodl, kolik ze kterého dotazu se má vypsat.
Vidíš, dobrý nápad. Udělám to, jak píšeš.

Díky moc za všechno!
Kajman_
Profil *
stepanka:
Teď vypadá takto, a vypisuje to správně
Ale u [#6] je stejné řazení jako u [#2] a v [#3] je jiné. Včera bylo na chvíli to řazení v [#2] opačně, ale brzy jsem to opravoval. Já jen, aby budoucí generace nemyslely, že [#3] je dobře.
stepanka
Profil *
Kajman:
Tak teď jsem z toho trochu zmatená, protože se mi ty kódy opravdu liší, možná jsem se ji i já někde spletla. Každopádně teď mi to funguje správně, tak jak píšu v [#6] . Už mám i ty další dotazy a úpravy v PHP pro výběr před a po programu. Téma tedy vyřešeno. Děkuju.

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