Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z sortowaniem query
Forum PHP.pl > Forum > Bazy danych > MySQL
dragonsokol
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.
pianta_d
Pokaż strukturę bazy i to co już zrobiłeś.
dragonsokol
  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.
Zdunek
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
tvister
Coś mi się wydaje że w mysql można zrobic:
  1. ....ORDER BY FIELD(field_name, 1,2,3,4,5);
dragonsokol
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).
tvister
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;

dragonsokol
Niestety, nie działa. Produkty bez zip code (z zerowym) przeplatają się z tymi które mają, pozatym też zwraca je nie zawsze dobrze..
piotr.kazmierczak
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.
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.