Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie wiążące rekordy w pary, Znalezienie jednej pary
banpl
post 22.05.2009, 23:43:06
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 2.11.2005
Skąd: Radomsko

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


Witam wszystkich, mam mały problem
przeczytałem post Zapytanie wizążące rekordy w pary

mój problem jest podobny ale dzięki temu postowi jakoś nie mogę sobie poradzić sad.gif

Otóż mam tabelę

id|x|y|A
---------
1|1|1|1
2|2|3|1
3|3|2|1
4|4|4|0
5|6|6|0
6|5|4|0

w kolumnach x, y są zapisane współrzędne punktu w układzie współrzędnych, natomiast A oznacza do jakiej grupy należy, np. 1 to x, a O to kółko na wykresie.

chcę wyznaczyć parę punktów, których odległość między nimi jest najmniejsza, matematycznie jest to rozwiązane : sqrt( (x2-x1)^2 + (y2-y1)^2) (odległość 2 punktów w układzie)

stworzyłem takie zapytanie :
  1. SELECT *, sqrt((t2.x-t1.x)*(t2.x-t1.x)+(t2.y-t1.y)*(t2.y-t1.y)) AS odleglosc_sqrt
  2. FROM LDF t1, LDF t2
  3. WHERE t1.A != t2.A


ale to zapytanie wyświetla mi aż 18 wyników, 2 razy to samo tylko odwrotnie, i nie wiem jak z tego wyświetlić parę o najmniejszej odległości sad.gif

jakieś pomysły questionmark.gif

Ten post edytował banpl 23.05.2009, 01:48:11


--------------------
Warsztat :: Windows7 / Ubuntu | PHP 5 | MySQL 5 | Eclipse / NetBeans | Opera / Firefox
Go to the top of the page
+Quote Post
Zbłąkany
post 23.05.2009, 08:39:20
Post #2


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

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


Ja bym spróbował to Twoje zapytanie umieścić, jako podzapytanie i z niego pobierać niezdublowane pary, określając odpowiedni warunek. Poza tym przy takim łączeniu tabel w zapytaniu zawsze dostaniesz iloczyn kartezjański i na tym iloczynie system bazodanowym wykonuje zapytanie, stąd pojawiają się odwrotne duplikaty. Istnieje też możliwość, że napiszesz sobie funkcję w T-SQL, która Twój otrzymany zbiór sprawdzi, rekord po rekordzie i wyrzuci duplikaty.


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
banpl
post 23.05.2009, 22:10:39
Post #3





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 2.11.2005
Skąd: Radomsko

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


yyy, trochę się nie orientuję jak to wykonać worriedsmiley.gif

możesz podać jakiś przykład, wskazówkę jak to wykonać, może kawałek kodu questionmark.gif

a czy takie rozwiązanie ma sens questionmark.gif

  1. SELECT TOP 1 t1.x AS x0, t1.y AS y0, t2.x AS x1, t2.y AS y1
  2. FROM LDF t1, LDF t2
  3. WHERE t1.A != t2.A
  4. ORDER BY SQRT((t2.x-t1.x)*(t2.x-t1.x)+(t2.y-t1.y)*(t2.y-t1.y))


mam wyświetloną parę punktów pomiędzy którymi jest najmniejsza odległość, oczywiście jeśli jest inna para, która ma taka samą odległość to jest ignorowana


--------------------
Warsztat :: Windows7 / Ubuntu | PHP 5 | MySQL 5 | Eclipse / NetBeans | Opera / Firefox
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 Wersja Lo-Fi Aktualny czas: 22.06.2025 - 10:25