Autor Zpráva
kini
Profil
Ahoj. Chtěl bych se zeptat jak seřadit výsledky sql dotazu aby se řadily podle datumu s tím že když je datum v db nižší než současné datum zařadí se nakonec. Tzn pokut dnes je 18.01 a v db mám datumy 17.01, 18.01 a 19.01 tak jejich pořadí bude 18.01, 19.01, 17.01.
Tomášeek
Profil
kini:
Nejsem si zcela jist (a nemám kde vyzkoušet), ale mohlo by to být něco podobného

... ORDER BY datum >= NOW() DESC

Možná ještě za to předat , datum, zkus.
kini
Profil
Funguje to na localhostu ale ne na hostingu.
blaaablaaa
Profil
kini:
Mas datumy ulozene jako DATE?
kini
Profil
Ano.
CZechBoY
Profil
ORDER BY DATE_FORMAT(datum, '%Y-%m-%d') = CURDATE() DESC, datum DESC
kini
Profil
CZechBoY:
To nefunguje už vůbec. Vrací mi to chyby
date_format() expects parameter 1 to be DateTimeInterface, string given
a
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= CURDATE() DESC  timestamp_show DESC' at line 1
CZechBoY
Profil
Posli cos tam poslal...
To co jsem psal je sql a ne php.
kini
Profil
CZechBoY:
Tenhle kod funguje a dělá přesně to co od něj chci na localhostu ale ne na hostingu:
->order(self::COLUMN_date . ' >= NOW() DESC ')
juriad_
Profil *
kini:
A mohl bys nám ukázat, jak se to špatně chová? A jak by se to na stejných datech mělo chovat?
Tomášeek ti navíc řekl, že můžeš použít sekundární řazení podle datum, což ty neděláš.
kini
Profil
juriad:
Pokut dnes je 18.01 a v db mám datumy 17.01, 18.01, 19.01, 20.01 a 21.01 tak jejich pořadí bude 19.01, 20.01, 21.01, 18.01, 17.01. Na localhostu to funguje. Na hostingu se to vypisuje v pořadí: 21.01, 20.01, 19.01, 18.01, 17.01.
Keeehi
Profil
kini:
1) Vypiš si sestavený dotaz a zkus ho spustit ručně v administraci databáze na hostingu. Pokud ti bude dávat jiné výsledky jak na localhostu tak na hostingu, tak nám ho tu ukaž.
2) Nemůže to být nějakou keší? Frameworky na localhostu keše vypínají. Na hostingu bývá třeba je promazat po nahrání nové verze.
kini
Profil
Keeehi:
SELECT * FROM `articles` ORDER BY datum >= NOW() DESC

Na localhostu jinej výsledek než na hostingu.
Kajman
Profil
Protože tam nemáte upřesněné pořadí, jen to, že proběhlé mají být pod blížícími se. Doplňte další řazení...
SELECT * FROM `articles` ORDER BY datum >= NOW() DESC, CASE WHEN datum >= NOW() THEN datum END, datum DESC

Nebo by mohlo být přehlednější
(SELECT * FROM `articles` WHERE datum >= NOW() ORDER BY datum)
UNION ALL
(SELECT * FROM `articles` WHERE datum < NOW() ORDER BY datum DESC)
TomášK.
Profil *
Kajman
Ten příklad s UNION ALL podle mě není korektní, UNION nezaručuje, že zachová pořadí:

Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows.
kini
Profil
Kajman:
V phpmyadminu to funguje.
Kajman
Profil
TomášK.:
To je fakt, proto kini raději zkuste první příklad.
Kcko
Profil
TomášK.:
UNION zachová pořadí pokud se k tomu doplní nějaký LIMIT, např LIMIT 123456789
TomášK.
Profil *
Kcko:
Zdroj? Já jsem to zkopíroval z dev.mysql.com/doc/refman/5.7/en/union.html, nevidím tam zmínku o tom, co říkáš. Je to pozorované chování nebo někde z dokumentace?
Kcko
Profil
TomášK.:
UNION špatně řadí jednotlivé sady výsledků + vyzkoušeno.
TomášK.
Profil *
Kcko:
Z odkazovaného vlákna (ani z té dokumentace) neplyne, že by po přidání LIMITu UNION zachoval řazení. O limitu se tam píše, že je zpravidla v poddotazech s společně ORDER BY, protože bez něj by tam ORDER BY nemělo žádný efekt. Že to tak funguje věřím, ale může se to bez varování změnit.

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: