Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Grupowanie LEFT JOIN według daty
Forum PHP.pl > Forum > Przedszkole
rafik73
Witam

Może naświetlę uproszczonym przykładem

tabela osoby zawiera kolumnę osoby_id i rekordy:

osoby_id
-----------
jacek
piotrek
konrad
paweł
grzesiek
krzysiek
tomek
marek

tabela terminarz:

data | id_w | id_m
--------------------------------------------
2016-06-01 | jacek | tomek
2016-06-08 | piotrek | konrad
2016-06-15 | marek | grzesiek

Zapytanie:

[MYSQL] pobierz, plaintext
  1. $osoby_query = mysql_query("SELECT * FROM osoby
  2. LEFT JOIN terminarz ON (id_m=osoby_id OR id_w=osoby)
  3. WHERE osoby_spec = 1
  4. GROUP BY osoby_id
  5. ORDER BY ISNULL(data) desc, MAX(data) asc ")
[MYSQL] pobierz, plaintext


wyświetla w kolejności:

paweł
krzysiek

jacek
tomek
piotrek
konrad
grzesiek
marek

a chcę by wyświetlało:

paweł
krzysiek

jacek
tomek
piotrek
konrad
marek
grzesiek


Czemu zamienia miejscami marek i grzesiek i nie sortuje jednolicie?
trueblue
Bo taka jest naturalna kolejność w tabeli osoby, a sortowanie w przypadku równych dat nie wprowadza żadnych zmian.
rafik73
Jest jakiś sposób, żeby to ujednolicić?
trueblue
Dodaj warunek: id_m=osoby_id
rafik73
dodałem


WHERE id_m=osoby_id


efekt, wyświetla:

tomek
konrad
grzesiek

pomija kolumnę id_w i wartości ISNULL
trueblue
  1. ORDER BY ISNULL(DATA) DESC, MAX(DATA) ASC,id_m=osoby_id

Nie jest to optymalne rozwiązanie.
rafik73
czemu nie optymalne?

Dobry jesteś trueblue, sortuje wg moich oczekiwań. Dzięki serdeczne.
trueblue
Bo gdyby naturalna kolejność była własnie: grzesiek, marek, przy zachowaniu takiej samej kolejności danych w tabeli terminarz, to byłaby inna kolejność.
W Twoim przypadku najlepszym rozwiązaniem jest:
1. Nadanie autonumer do tabeli osoby (i to ten powinien być kluczem głównym oraz kluczami obcymi id_w i id_m, a nie imię). Wtedy można dodać sortowanie po wartości tego klucza jeśli chcesz zachować naturalną kolejność.
lub:
2. Dodanie dodatkowej kolumny z własnym "kluczem" sortowania do tabeli osoby (jeśli kolejność może być inna do naturalnej kolejności). Pomimo tego warto zastosować pierwszą połowę punktu 1. Sortowanie dokonujesz po tej kolumnie.
rafik73
A gdyby tabela terminarz składała się z :

data | id_w1 | id_m1 | id_w2 | id_m2
-------------------------------------------

I chciałbym wyświetlić w kolejności :

id_w1
id_m1
id_w2
id_m2

?
trueblue
Nie jestem pewien, dodaj warunek:
  1. FIELD(osoby_id,id_w1,id_m1,id_w2,id_m2)
rafik73
  1. FIELD(osoby_id,id_w1,id_m1,id_w2,id_m2)


Wyświetla w kolejności:

id_m1,id_w2,id_m2,id_w1
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.