Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] usuwanie podobnych rekordów
Forum PHP.pl > Forum > Bazy danych
maniana
Witam, robię serwis z nieruchomościami no i natknąłem się na niemały problem. Mianowice przy wyszukiwaniu ofert muszę założyć taki filtr który omijał by zdublowane oferty ... Oferty z takim samym miastem, ulicą, ilością pięter i powierzchnią są teoretycznie takie same. Z tym, że powierzchnia musi być zaokrąglona do liczby całkowitej...
Teoretycznie oferty:

MIASTO | ULICA | POWIERZCHNIA
------------------------------------------
NazwaMiasta | NazwaUlicy | 999.5
NazwaMiasta | NazwaUlicy | 1000
NazwaMiasta | NazwaUlicy | 1000.5

są takie same...

Pomyślałem, żeby użyć
  1. CONCAT(MIASTO,ULICA,POWIERZCHNIA) AS filtr
i później dać
  1. GROUP BY filtr

Ale pole powierzchnia trzeba by zaokrąglić i nie wiadomo czy w górę czy w dół ... Ktoś ma jakieś pomysły questionmark.gif Wiem, że można to zrobić za pomocą PHP, muszę jednak to zrobić w MySQL

Ma ktoś jakieś pomysły?
Dzięki za jakiekolwiek sugestie
Darti
Taka sugestia:
Zastosowałbym funkcję MySQLa Round()
Oraz bezcenne wskazówki Sedziwoja z tego tematu

Pozdrawiam
maniana
No cóż, round() tutaj wiele nie pomoże
  1. SELECT powierzchnia,concat(miasto,ulica,round(powierzchnia)) AS filtr FROM offer

zwraca nam taki wynik:

1 => 999.5 | NazwaMiastaNazwaUlicy999
2 => 1000.5 | NazwaMiastaNazwaUlicy1000
3 => 1000 | NazwaMiastaNazwaUlicy1000

Rekord 2 i 3 dostały tą samą wartość pola filtr ale rekord pierwszy już nie... Chodzi o to by rekordy 1 i 2 nie zostały zostały wyświetlone. Rekord 3 niby jest najbliższy prawdy ponieważ jego powierzchnia zawiera się pomiędzy powierzchnią rekordu 1 i 2. Takie rozwiązanie wydało mi się najlepsze ale jak widać trzeba by liczby zaokrąglać w dół i w górę (floor i ceiling) ale i tak nie wiadomo kiedy jakie zaokrąglanie wybrać.
Kicok
A skąd MySQL ma wiedzieć, czy chcesz zamieniać 999.5 na 1000, czy na 999? Wydaje mi się, że możesz co najwyżej pobrać średnią wielkość powierzchni dla danego miasta i ulicy a następnie "podobne" wpisy pobierać z warunkiem:

WHERE powierzchnia BETWEEN $avg-1 AND $avg+1


http://dev.mysql.com/doc/refman/5.0/en/gro...ml#function_avg
maniana
Jednak by ominąć takie rekordy trzeba sporo się napocić. Pozostaje jednak sposób opisany powyżej lub sprawdzanie danych przy dodawaniu ofert.
Można jeszcze zaokrąglać powierzchnie do 10 za pomocą
  1. (round(powierzchnia/10)*10))
Jednak 10m2 to dość sporo.

W każdym razie, dzięki za sugestie
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.