![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 68 Pomógł: 0 Dołączył: 8.08.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Borykam się z problemem odpowiedniego sortowania pobranych wyników z bazy danych. W tabeli mam rekordy które przechowują wydarzenia w mieście. Struktura to: id, nazwa, dzien, godzina (gdzie poniedziałek = 1 a niedziela = 7) Chciałbym aby sortowanie było zależne od dnia tygodnia który jest aktualnie. Funkcją date("w") pobieram aktualny dzień tygdnia. Tak formułuje zapytanie: SELECT * FROM wydarzenia WHERE dzien>=$dzien_aktualny ORDER BY dzien ASC LIMIT 1 Problem jest taki, że jeżeli dziś jest środa, to zapytanie wyszuka najbliższe wydarzenie od dziś do niedzieli. Muszę zrobić za pomocą jednego zapytania w taki sposób, że jeżeli od dziś do niedzieli nie ma żadnego wydarzenia to wyszukuje dalej czyli od niedzieli do wtorku. Przykład sortowania: dziś jest środa czyli $dzien_aktualny = 3. Rekordy powinny być sortowane według dni w takiej kolejności 3,4,5,6,7,1,2 Proszę o pomoc. Zależy mi na tym aby było to w jednym zapytaniu. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Czy nie prosciej jest zapisywac datę jako format SQL DATE, lub ewentualnie unixowy timestamp (w bazie bedzie to zwykly INT, w php bedzie aktualny timestamp pobierany funkcją time())
Jesli wybierzesz uniksowy timestamp to zapytanie o x dni tygodnia w przód począwszy od dzis moze np wygladac tak:
podczas zapisywania wydarzen w podobny sposob obliczasz timestamp wydarzenia, podstawiasz odpowiednie wartosci do hour,minute, second, month... i zapisujesz to w kolumnie date. Ten post edytował Orzeszekk 27.02.2012, 00:00:05 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 68 Pomógł: 0 Dołączył: 8.08.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przepraszam, nie wspomniałem, że nie mogę wykonać tego w taki sposób.
Niektóre wydarzenia potarzane są co tydzień i istnieć będzie wtedy dla niego tylko jeden rekord dlatego jedyne informacje które przechowuję to dzień i godzina. Ten post edytował denis94 27.02.2012, 00:15:05 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Bardzo pasuje do twojego problemu funkcja DAYOFWEEK( ),
http://www.freeopenbook.com/mysqlcookbook/...-6-sect-10.html |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
SELECT w.*, if(w.dzien>=$dzien_aktualny, 1, 0 ) as jest FROM wydarzenia ORDER BY jest desc, w.dzien ASC LIMIT 1
Albo to co masz + UNION ALL SELECT * FROM ( SELECT * FROM wydarzenia WHERE dzien>=$dzien_aktualny ORDER BY dzien ASC LIMIT 1 UNION ALL SELECT * FROM wydarzenia WHERE dzien<$dzien_aktualny ORDER BY dzien ASC LIMIT 1 ) a LIMIT 1 Ten post edytował maly_swd 27.02.2012, 13:32:03 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Edit: mały błąd w kalkulacjach (IMG:style_emoticons/default/biggrin.gif) Ten post edytował melkorm 27.02.2012, 13:48:18 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 68 Pomógł: 0 Dołączył: 8.08.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dzięki, działa tak jak powinno, użyłem sposobu melkorma.
Mam jeszcze problem z uwzględnieniem godziny. Mianowicie, jeżeli dziś jest poniedziałek godzina 20 to najbliższe wydarzenie pokazuje na poniedziałek o godzinie 17-tej pomimo tego, że na wtorek też jest wpisane wydarzenie. Czyli skrypt nie uwzględnia tego, czy wydarzenie zaplanowane na dziś już minęło czy nie. Godzinę zapisuję w normalnej postaci, numerycznie. Przykład, jeżeli aktualnie jest poniedziałek, godzina 20 - to najbliższe wydarzenie powinno być wyszukane w taki sposób: od poniedziałku o godzinie dwudziestej, do następnego poniedziałku godziny dziewiętnastej. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
Rozwiazaniem Twojego problemu bedzie zrobienie pola DATE_TIME gdzie masz trzymana date i godzine wydazenia. Pozniej przy pomocy zwyklego WHERE albo BETWEEN mozesz wybierac co chcesz i sortowac jak chcesz:)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 15:04 |