Autor Zpráva
Maringotka
Profil *
Zdravím.

V tabulce [novinky] skladuji novinky. Při výpisu je řadím následovně:

SELECT *
FROM `novinky`
ORDER BY `datum` DESC, `id` DESC


Sloupec `datum` je UNIX TIMESTAMP, přičemž pro jedno datum je shodný (tzn. všechny novinky přidané dnes budou mít stejný timestamp). Dále sestupné řazení podle ID je tu proto, aby se později přidané novinky (tj. s vyšším ID) zobrazily ve výpisu výše.

Ve své aplikaci také získávám konkrétní novinku podle ID.

A zde je můj problém:
Jakým způsobem mohu získat ID předchozí a následující novinky tak, aby to odpovídalo výše zmíněnému řazení? Následující kód nefunguje:

SELECT *, `id` AS `actual_id`, `datum` AS `actual_date`, (
SELECT `id` 
FROM `novinky` 
WHERE `id` <> `actual_id` AND `datum` <= `actual_date` 
ORDER BY `datum` DESC, `id` DESC 
LIMIT 1) AS `prev`, (
SELECT `id` 
FROM `novinky` 
WHERE `id` <> `actual_id` AND `datum` >= `actual_date` 
ORDER BY `datum` DESC, `id` DESC 
LIMIT 1) AS `next` 
FROM `novinky` 
WHERE `id` = 47
Kajman_
Profil *
WHERE `datum` < `actual_date` OR  (`datum` = `actual_date` AND `id` < `actual_id`)
...
WHERE `datum` > `actual_date` OR  (`datum` = `actual_date` AND `id` > `actual_id`)
Maringotka
Profil *
Kajman:
Ahoj. Tahle podmínka selže, pokavaď přidám novinku, která je staršího data než doposud nejnovější.
Čili jakási vměstnaná novinka, která má nejvyšší ID, ale ne nejvyšší timestamp. Mám z toho převařený mozek :-(
Joker
Profil
Maringotka:
Tahle podmínka selže, pokavaď přidám novinku, která je staršího data než doposud nejnovější.
Neselže, mělo by to fungovat stejně jako řazení v prvním příspěvku.
Tj. dodatečná novinka se zařadí podle času a teoreticky kdyby existovala jiná odeslaná přesně ve stejný čas, ta dodatečná bude „novější“.

Čili pokud neodesíláte více novinek v přesně stejný čas (na sekundu), bylo by jednodušší prostě řadit jen podle sloupce datum.
Maringotka
Profil *
Joker:
V tom je právě ta potíž - pro celý den je timestamp stejný. Při ukládání se totiž převádí na aktuální datum, ovšem jako čas se zvolí půlnoc... Proto Kajmanova podmínka bohužel selže.

Na druhou stranu si říkám, že řešení musí existovat, když jsem schopen získat seřazený výpis (vizte [#1])...
Kajman_
Profil *
Podmínky jsou dobře, ale nevšiml jsem si, že jste měl chyby i v order by u next.

SELECT *, `id` AS `actual_id`, `datum` AS `actual_date`, (
SELECT `id` 
FROM `novinky` 
WHERE `datum` < `actual_date` OR  (`datum` = `actual_date` AND `id` < `actual_id`)
ORDER BY `datum` DESC, `id` DESC 
LIMIT 1) AS `prev`, (
SELECT `id` 
FROM `novinky` 
WHERE `datum` > `actual_date` OR  (`datum` = `actual_date` AND `id` > `actual_id`)
ORDER BY `datum`, `id`
LIMIT 1) AS `next` 
FROM `novinky` 
WHERE `id` = 47


Něco podného je i ve faq.
Maringotka
Profil *
Kajman:
Mockrát děkuji, zachránil jste mě před zešedivěním :-)
Za nepřečtení FAQ se stydím, příště se polepším :-(

Ještě jednou díky!

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: