Avatar billede websam Nybegynder
14. juni 2006 - 12:53 Der er 9 kommentarer og
1 løsning

En lidt kryptisk sql sætning ?

Hejsa,

Jeg sidder og skal have lavet en sql forespørgelse der for mig er noget kryptisk.

Jeg har et image map med x antal felter som hver især holder på et koordinat sæt 0;0 0;1 0;2 osv.

Det skal er at når en bruger klikker på et givent felt i dette image map så skal jeg finde top 5 records fra databasen der ligger tættest på det felt der er klikket på.

Altså hvis der er klikket på felt med koordinat 12;32 skal forespørgelsen kunne finde frem til hvilke 5 koordina sæt i databasen der ligger tættest på.

tabellen i databasen indeholder 2 felter et til x-koordinat og et til y-koordinat.

Er der en der kan hjælpe mig med dette ?

/Websam
Avatar billede teepee Nybegynder
14. juni 2006 - 13:10 #1
Du kan jo starte med at lave et udtræk over koordinater der ligger indefor et bestemt interval, eks. +/- 3 dvs. x mellem 9 og 15 og y mellem 29 og 35 eller noget i den stil.
Så kan du jo beregne afstanden matematisk for de tilbageværende felter.
Noget a la:
select top 5 x,y, sqr(x*x+y*y)
from tabel
where x between m-3 and m+3
and y between n-3 and n+3
order by sqr(x*x+y*y)
Avatar billede websam Nybegynder
14. juni 2006 - 13:44 #2
Jeg kan bare ikke lave det med en bestemt antal da jeg ikke ved om der er f.eks 10, 25 el. 49 imellem de 5 der ligger tættest på det sted der bliver klikket, nogen foreslag til det ?

/Websam
Avatar billede websam Nybegynder
14. juni 2006 - 14:03 #3
Og når jeg tester den på min sql server får jeg denne fejl :

'sqr is not a recognized function name'
Avatar billede ldanielsen Nybegynder
14. juni 2006 - 14:25 #4
SQRT(value) er det ...
Avatar billede teepee Nybegynder
14. juni 2006 - 15:07 #5
hvis du vil have dem der ligger nærmest må du beregne for dem alle.
Eks. vil 12.36 ligge tættere på end 9.29 og den er endda smidt væk med det indledende filter. det må være et spørgsmål om performance iht. korrekte svar.
hvis data er statiske, kan du beregne top 5 for hvert felt om natten, og gemme disse informationer i en tilhørende tabel. så kan du med lethed slå de nærmeste 5 op.
Avatar billede websam Nybegynder
14. juni 2006 - 15:11 #6
ok SQRT virker, men så kommer der så et nyt spørgsmål.

Når en bruger har klikket i et felt får jeg et koordina sæt 2;2 f.eks. for at kunne bruge dette koordinat sæt skal jeg beregne afstanden i x og y i forhold til det koordinat sæt der er klikket på og de koordinat sæt der ligger for hver record i databasen.

Altså klikket på :

2;2

i databasen ligger der så :

0;0
0;1
0;2
osv.

her skal jeg så beregne afstanden i x og y retning inden el. i samme ombæring med at jeg tager kvardrat roden.

Nogen ideer ?

/Websam
Avatar billede teepee Nybegynder
14. juni 2006 - 16:13 #7
faktisk er det jo ikke x og y der repræsenterer afstandsvektoren mellem punkterne, du skal bruge x-n og y-m så selecten må være

select x, y, sqrt((x-n)*(x-n)+(y-m)*(y-m))

afstanden til 0,0 er jo ikke 0 fra 12,32 :-)
Avatar billede websam Nybegynder
14. juni 2006 - 20:45 #8
Så er den der :

SELECT TOP 5 Id, Firstname, KoordinatX, KoordinatY, SQRT((10 - KoordinatX) * (10 - KoordinatX) + (10 - KoordinatY) * (10 - KoordinatY)) AS Result
FROM tbl_dealer
ORDER BY SQRT((10 - KoordinatX) * (10 - KoordinatX) + (10 - KoordinatY) * (10 - KoordinatY))
Avatar billede teepee Nybegynder
15. juni 2006 - 08:56 #9
Det ser godt ud, men husk at du ved hjælp af et filter på x og y kan gøre beregningen noget hurtigere, men knap så præcis. Alternativt hvis data ikke ændrer sig så meget kan du lave genberegninger hvergang du indsætter et nyt koordinat.
Avatar billede websam Nybegynder
19. juni 2006 - 10:51 #10
teepee >> Jeg er med på at det vil blive hurtigere hvis jeg har filter på, men jeg kan bare ikke bruge det i dette tilfælde og umiddelbart ser det ud til ikke at være det store problem, men det må jeg holde lidt øje med og så benytte mig af filteret hvis det bliver for sløvt.

Tak for hjælpen ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester