Avatar billede kwanstudios Nybegynder
18. maj 2003 - 01:38 Der er 30 kommentarer og
2 løsninger

Find nærmeste forhandler vha. postnummer

Jeg har en række forhandlere i en MySQL database, som jeg ønsker at kunne søge efter ved hjælp af postnummer. Men det skal ikke kun være dem med postnummer lig det angivne søgeord, blot dem der har et postnummer tættest på. Det må da være rimelig nemt for jer super seje eksperter? ;)
Avatar billede schaefner Juniormester
18. maj 2003 - 01:45 #1
Også dem der har et postnummer der ligner, eller hvad?
Avatar billede bearhugx Nybegynder
18. maj 2003 - 01:56 #2
Kwan - taler du om den geografisk nærmeste forhandler - eller den som er nummerisk tættest på, hvad angår postnr.

et eksempel - hvis der er en forhandler i Odense(5000) og Kolding(6000) - og man så er i Nyborg (5800) -
så vil den geografisk nærmeste være Odense(30 km)
men den nummeriske tætteste vil være Kolding (delta-postnr 200)
(Odense = delta-postnr 800)

Så hvis man kun har postnr. at arbejde udfra, så kommer man lidt på gale veje
/Søren

ps. der er 97 km  fra Nyborg (5800) til Kolding(6000) - Det er en forskel på 67 km :-)
Avatar billede schaefner Juniormester
18. maj 2003 - 02:32 #3
Snakker vi geografisk, så er det jo noget af et større projekt.
Avatar billede roenving Novice
18. maj 2003 - 02:34 #4
-- ja det vil vel nærmest være nemmest at lægge et felt ind med de postnumre hver forhandler dækker ...
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 02:36 #5
Blot nummerisk er fint nok, geografisk bliver uoverskueligt :)
Avatar billede schaefner Juniormester
18. maj 2003 - 02:36 #6
altså som bearhugx har beskrevet?
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 02:38 #7
Ja, det nummer der er tættest på. Kan ikke rigtig se hvordan det andet skulle bygges op.
Avatar billede schaefner Juniormester
18. maj 2003 - 02:42 #8
Udfra det nr. man indtaster hvor stor må "margenen" være? Altså hvis jeg indtaster 4534 må den så også "pinge" ved f.eks. 5000, eller hvordan?
Avatar billede bearhugx Nybegynder
18. maj 2003 - 02:42 #9
men du er så indforstået med at det i _mange_ situationer vil give et falsk resultat (den "nærmeste forhandler" er ikke længere "den nærmeste")...

som jeg tror at roenving er inde på, så kunne du jo dele landet op i divisioner/områder, som hver har en hovedforhandler - er der f.eks. kun en på Fyn (i Odense) kunne du f.eks. sende alle 5xxx postnr. dertil....

/Søren
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 02:43 #10
ah, det bliver igen for besværligt.. kan ikke rette i databasen, der må da være en geografisk metode der kan lade sig gøre via php?
Avatar billede bearhugx Nybegynder
18. maj 2003 - 02:43 #11
Hvis du vil følge "distrikt"-ideen, så kan du jo lave en liste over forhandlere - og så kan vi hjælpe dig til at finde ud af, hvor distriktsgrænserne evt. skal ligge
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 02:45 #12
Det bliver uoverskueligt med en løbende opdateret liste på 4-500 steder?
Avatar billede roenving Novice
18. maj 2003 - 02:45 #13
-- to felter: fra- og til-dækning -- evt. 4 til de mærkelige, eks. 1800-1999 og 2500-2660
Avatar billede bearhugx Nybegynder
18. maj 2003 - 02:47 #14
er der 4-500 forhandlere ?.... jo flere fohandlere (især hvis der er en i alle større byer) betyder at "nærmeste postnr" - i mange tilfælde også bliver geografisk tætteste...
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 02:48 #15
yes, det er en løbende opdateret liste, som der ikke kan sorteres.. Kunne du give mig et eksempel på hvordan man finder de nærmeste forhandlere ved hjælp af nummerisk søgning?
Avatar billede bearhugx Nybegynder
18. maj 2003 - 03:02 #16
Dette finder den nærmeste forhandler på Nyborg ($her = 5800)

$naermeste_delta_postnr = "10000";
$naermeste_id = "";
$her = "5800";
$result = mysql_query("SELECT id, postnr FROM forhandlere");
for( $i=0; $i<mysql_num_rows($result); ++$i ) {
  $row = mysql_fetch_array($result);
  $delta_postnr = abs( $her - $row["postnr"] )
  if( $delta_postnr < $naermeste_delta_postnr ) {
    $naermeste_delta_postnr = $delta_postnr;
    $naermeste_id = $row["id"];
  }
}

Derefter burde den nærmeste forhandlers id ligge i $naermeste_id - lige til at slå op i databasen


.... Men det er ikke testet

/Søren
Avatar billede bearhugx Nybegynder
18. maj 2003 - 03:04 #17
Og jeg kan bl.a. se, at jeg har glemt et ; efter abs( $her - $row["postnr"] )
Avatar billede bearhugx Nybegynder
18. maj 2003 - 03:06 #18
Men der er mange måder den ovenstående funktion kan optimeres på - bl.a ved at hoppe ud af løkken, hvis der findes en forhandler med $delta_postnr = 0 - det er jo så samme by, som der søges fra... Og det må vel betragtes som "nærmeste" :-)
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 03:15 #19
Jeg kigger på det imorgen tidlig, tak for din hjælp indtil nu :)
Avatar billede roenving Novice
18. maj 2003 - 05:13 #20
-- og een af forbedringerne kunne være:

$herbund = parseInt($her)-1000; //eller måske snævrere 500 ?-)
$result = mysql_query("SELECT id, postnr FROM forhandlere WHERE postnr>$herbund");

-- juster sætningerne -- PHP og SQL er sprog jeg _ikke_ har check på ...
Avatar billede bearhugx Nybegynder
18. maj 2003 - 05:39 #21
med roenvings og mit forslag  (stadig utestet):

$naermeste_delta_postnr = "10000";
$naermeste_id = "";
$her = "5800";
$result = mysql_query("SELECT id, postnr FROM forhandlere WHERE postnr BETWEEN ".$her-1000." AND ".$her+1000);
for( $i=0; $i<mysql_num_rows($result); ++$i ) {
  $row = mysql_fetch_array($result);
  $delta_postnr = abs( $her - $row["postnr"] )
  if( $delta_postnr < $naermeste_delta_postnr ) {
    $naermeste_delta_postnr = $delta_postnr;
    $naermeste_id = $row["id"];
  }
  if($delta_postnr = 0)
    break;
}
Avatar billede erikjacobsen Ekspert
18. maj 2003 - 08:13 #22
Selv med 4-500 hundrede forhandlere er dette en yderst uhensigtsmæssig
løsning. Der er vel næppe færre boghandlere, men et "boghandlersted"
på nettet brugte samme metode, sikkert i forventning om at det også
var "godt nok".

Men der er ingen boghandel i 8361. Der er i 8260, som er det nærmeste.
Den kom slet ikke på listen, men der blev i stedet henvist til Grenå
og Samså - og det du'r ikke.

Laver du projektet for sjov, så fortsæt da bare. Laver du det for penge,
professionelt, kan du ikke tillade dig overfor din kunde at aflevere
sådan en løsning.

Fortæl kunden det ikke kan lade sig gøre, eller bede om flere penge
til det, eller køb en "geografisk tabel" et eller andet sted. Det kan
man sikkert, hvis man leder efter det.
Avatar billede kwanstudios Nybegynder
18. maj 2003 - 12:40 #23
Kunne det eventuelt kombineres med amter?
Avatar billede kwanstudios Nybegynder
24. maj 2003 - 15:01 #24
dem der føler sig fortjent til point bedes smide et svar :)
Avatar billede roenving Novice
24. maj 2003 - 15:09 #25
Øeh ...
Avatar billede bearhugx Nybegynder
25. maj 2003 - 01:45 #26
Som erik pointerer, så er det en uhensigsmæssig løsning --- men jeg vil da gerne have nogle points for min møje....
/Søren
Avatar billede roenving Novice
25. maj 2003 - 01:50 #27
Skal vi så dele i porten ... '-)
Avatar billede bearhugx Nybegynder
25. maj 2003 - 01:53 #28
roenving >> sover du aldrig ??? ;-D
Avatar billede roenving Novice
25. maj 2003 - 01:55 #29
Hvorfor det -- bliver man ikke gammel af det ;O)
Avatar billede bearhugx Nybegynder
25. maj 2003 - 01:58 #30
Jeg har i hvert fald tænk mig det i den allernærmeste fremtid - gammel eller ej :-))

Sov godt - når/hvis du kommer til det punkt :-D

/Søren
Avatar billede roenving Novice
25. maj 2003 - 02:00 #31
*g*
Avatar billede roenving Novice
28. maj 2003 - 14:06 #32
Takker for points ;~}
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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