Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL]Grupowanie LEFT JOIN według daty
rafik73
post
Post #1





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


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?

Ten post edytował rafik73 25.12.2016, 18:23:39
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Bo taka jest naturalna kolejność w tabeli osoby, a sortowanie w przypadku równych dat nie wprowadza żadnych zmian.
Go to the top of the page
+Quote Post
rafik73
post
Post #3





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


Jest jakiś sposób, żeby to ujednolicić?
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Dodaj warunek: id_m=osoby_id
Go to the top of the page
+Quote Post
rafik73
post
Post #5





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


dodałem


WHERE id_m=osoby_id


efekt, wyświetla:

tomek
konrad
grzesiek

pomija kolumnę id_w i wartości ISNULL

Ten post edytował rafik73 25.12.2016, 19:25:44
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


  1. ORDER BY ISNULL(DATA) DESC, MAX(DATA) ASC,id_m=osoby_id

Nie jest to optymalne rozwiązanie.
Go to the top of the page
+Quote Post
rafik73
post
Post #7





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


czemu nie optymalne?

Dobry jesteś trueblue, sortuje wg moich oczekiwań. Dzięki serdeczne.
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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.
Go to the top of the page
+Quote Post
rafik73
post
Post #9





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


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

?
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Nie jestem pewien, dodaj warunek:
  1. FIELD(osoby_id,id_w1,id_m1,id_w2,id_m2)
Go to the top of the page
+Quote Post
rafik73
post
Post #11





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 19.03.2014

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


  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
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: 24.08.2025 - 04:28