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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 16:32