Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z sortowaniem query
dragonsokol
post
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 2
Dołączył: 23.06.2008

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


Witam. Na początku opiszę o co mi chodzi.
Robię obecnie skrypt, który posortuje produkty w zależności od lokalizacji od kodu pocztowego (tu już napisałem skrypt, który zwraca mi kody pocztowe w kolejności od najbliższego do najdalszego), w bazie zapisuje kod pocztowy danego produktu.
Jak się zabrać do posortowania tego?
Zupełnie nie mam pomysłu.
Reasumując: chodzi mi o posortowanie wg tego co wypluje PHP, bo w bazie nie mam żadnych zależności między danymi kodami pocztowymi.

Ten post edytował dragonsokol 21.10.2011, 00:53:30
Go to the top of the page
+Quote Post
pianta_d
post
Post #2





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


Pokaż strukturę bazy i to co już zrobiłeś.
Go to the top of the page
+Quote Post
dragonsokol
post
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 2
Dołączył: 23.06.2008

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


  1. +-------------------+----------------+------+-----+---------+----------------+
  2. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  3. +-------------------+----------------+------+-----+---------+----------------+
  4. | id | int(11) | NO | PRI | NULL | AUTO_INCREMENT |
  5. | name | varchar(255) | NO | | NULL | |
  6. | description | varchar(10000) | NO | | NULL | |
  7. | added_by | int(11) | NO | | NULL | |
  8. | added_time | int(11) | NO | | NULL | |
  9. | category | int(11) | NO | | NULL | |
  10. | end_time | int(11) | NO | | NULL | |
  11. | short_description | varchar(500) | NO | | NULL | |
  12. | image_main | int(11) | NO | | NULL | |
  13. | provided_where | int(11) | NO | | NULL | |
  14. | provided_zip | int(11) | NO | | NULL | |
  15. | provided_city | varchar(100) | NO | | NULL | |
  16. | provided_distance | int(11) | NO | | NULL | |
  17. | provided_zip_at1 | int(11) | NO | | NULL | |
  18. | provided_zip_at2 | int(11) | NO | | NULL | |
  19. | provided_country | varchar(100) | NO | | NULL | |
  20. +-------------------+----------------+------+-----+---------+----------------+
  21. 16 rows IN SET (0.00 sec)


Chcę by baza posortowała mi w zależności od odległości od danego ZIP code. Czyli wpisuję np. 10km od 123, skrypt znajduje, że najbliższym ZIPem jest 321, następnym 155, 555, itd.. Nie mają być one posortowane liczbowo (od najmniejszej/do największej i odwrotnie).
Chyba, że poprzez PHP będzie szybciej? Tzn. wyfetchować wszystko i wybrać to, co mnie interesuje.

Ten post edytował dragonsokol 21.10.2011, 06:21:31
Go to the top of the page
+Quote Post
Zdunek
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


Z ciekawości wszedłem w ten topic. Początkowo myślałem że jakiś banal, a jednak nie.

Rzecz jest o wiele cięższa. Musisz mieć właściwie dodatkową tabelę z pozycją x i y kodów, powiedzmy takie rozmieszczenie na mapie no i wyliczać sobie wektor(ew w bazie zostawić wektor, hmm, to by było chyba optymalne). No i poszukiwać nie po żadnych współrzędnych, lecz po wektorach. Tak chyba najłatwiej to by szło zrobić smile.gif
Go to the top of the page
+Quote Post
tvister
post
Post #5





Grupa: Zarejestrowani
Postów: 253
Pomógł: 29
Dołączył: 18.08.2008

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


Coś mi się wydaje że w mysql można zrobic:
  1. ....ORDER BY FIELD(field_name, 1,2,3,4,5);


--------------------
Kto rano wstaje ten leje jak z cebra.
Go to the top of the page
+Quote Post
dragonsokol
post
Post #6





Grupa: Zarejestrowani
Postów: 31
Pomógł: 2
Dołączył: 23.06.2008

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


Mam w bazie zapisane współrzędne, i na tej podstawie określa skrypt dystans.
Co do tego "ORDER BY FIELD" to posortuje mi dobrze nawet, jeżeli nie będzie danego kodu pocztowego? Po prostu go ominie?

EDIT:
testowałem ORDER BY FIELD, niestety działa bardzo słabo..
  1. SELECT `provided_zip_at1`
  2. FROM `offers`
  3. ORDER BY FIELD( `provided_zip_at1`, 3, 4, 12121, 8, 9, 1234, 12, 14, 8051, 10566, 9999, 888, 10001, 6, 5 )
  4. LIMIT 0 , 100

Zupełnie nie układa według kolejności sad.gif Tylko 12121, 1234, 8051, 10001 są w bazie zapisane (jeżeli chodzi o to query).

Ten post edytował dragonsokol 21.10.2011, 15:25:32
Go to the top of the page
+Quote Post
tvister
post
Post #7





Grupa: Zarejestrowani
Postów: 253
Pomógł: 29
Dołączył: 18.08.2008

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


Może tak zadziała:
  1. SELECT `provided_zip_at1`
  2. FROM `offers`
  3. ORDER BY FIELD( `provided_zip_at1`,5,6,10001,888,9999,10566,8051,14,12,1234,98,12121,4,3) DESC;



--------------------
Kto rano wstaje ten leje jak z cebra.
Go to the top of the page
+Quote Post
dragonsokol
post
Post #8





Grupa: Zarejestrowani
Postów: 31
Pomógł: 2
Dołączył: 23.06.2008

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


Niestety, nie działa. Produkty bez zip code (z zerowym) przeplatają się z tymi które mają, pozatym też zwraca je nie zawsze dobrze..
Go to the top of the page
+Quote Post
piotr.kazmiercza...
post
Post #9





Grupa: Zarejestrowani
Postów: 47
Pomógł: 10
Dołączył: 1.03.2010
Skąd: Warszawa

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


Ok więc tak:

Powiedzmy, że masz tablice kodów pocztowych razem z szerokościa i długościa geograficzną.

id
kod
lat
long

Pierw wyszkujesz w tej bazie kod pocztowy który szukasz (Z wyszukanego kodu pocztowego dostajesz lat_podanego_kodu i long_podanego_kodu) a następnie zapytanie:


  1. SELECT id, kod, ( 6371 * acos( cos( radians(lat_podanego_kodu) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(long_podanego_kodu) ) + sin( radians(lat_podanego_kodu) ) * sin( radians( lat ) ) ) ) AS distance
  2. FROM kody_pocztowe HAVING distance < 25 ORDER BY distance;


W wyniku otrzymasz posortowane kody po odległości mniejszej niż 25km.


--------------------
Facead.pl - Social Media Agency
Fishcode.pl - Blog
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: 21.08.2025 - 07:48