Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Mysql SELECT - Sortowanie uwzględniające dzień tygodnia.
denis94
post
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Orzeszekk
post
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:

  1. $dateInformation = getDate();
  2. $hour = 0;
  3. $minute=0;
  4. $second=0;
  5. $day = $dateInformation["day"];
  6. $month=$dateInformation["month"];
  7. $year = $dateInformation["year"];
  8. // currentTimestamp to timestamp momentu rozpoczęcia dzisiejszego dnia
  9. $currentTimestamp = mktime($hour,$minute,$second,$month,$day,$year);
  10. // maxTimestamp to górna granica wydarzeń - początek x dnia w przód
  11. $maxTimestamp = $currentTimestamp + ($ileDniWPrzód * 60*60*24);
  12. mysql_query("select * from wydarzenia where date> $currentTimestamp AND date < $maxTimestamp");


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
Go to the top of the page
+Quote Post
denis94
post
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
Go to the top of the page
+Quote Post
morman
post
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
Go to the top of the page
+Quote Post
maly_swd
post
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
Go to the top of the page
+Quote Post
melkorm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  1. SELECT *
  2. FROM `wydarzenia`
  3. ORDER BY IF( dzien<$dzien_aktualny,dzien+7 , dzien)


Edit: mały błąd w kalkulacjach (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował melkorm 27.02.2012, 13:48:18
Go to the top of the page
+Quote Post
denis94
post
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.
Go to the top of the page
+Quote Post
maly_swd
post
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:)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 15:04