Kom ihåg mig?
Home Menu

Menu


SQL och join

Ämnesverktyg Visningsalternativ
Oläst 2010-10-20, 15:38 #1
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
Standard SQL och join

Jag har ett fungerande script som gör nästan samma sak, den såg ut såhär:
Kod:
   $num_rows = intval($_GET[num]);
      
   $query = "SELECT postnummer as zip,count(*) AS density 
               FROM postnummer
               GROUP BY postnummer 
               LIMIT 1500";
               
   $result = mysql_query($query);
   
   $zip_geo_data_string = file_get_contents('zip_geo_data.txt');
   $zip_geo_data = unserialize($zip_geo_data_string); 
   
   $points = array();
   
   while($row = mysql_fetch_array( $result )) {
      $row[zip] = str_replace(" ","", $row[zip]);
         $lat = $zip_geo_data[$row[zip]]['lat'];
         $lon = $zip_geo_data[$row[zip]]['lon'];
         
         array_push($points, array('zip'=>$row[zip], 'density' => $row[density],'lat' => $lat,'lon' => $lon));
      }
      echo json_encode(array("Locations" => $points));
      exit;

Nu vill jag ta bort matchningen från txt filen och istället matcha mot en databas.

Jag har två tabeller.

postnummer: id | postnummer
postnummer_tbl: zipcode | long | lat

Jag vill returnera alla 'postnummer' från "postnummer" som matchar med 'zipcode' i "postnummer_tbl", i fall det är flera 'postnummer' som är lika så vill jag endast ha en rad men även räkna ut hur många som är samma. = density. Sedan vill jag para ihop rätt postnummer med 'zipcode' och hämta ut long, lat och density och göra till json kod för att kunna plotta ut på karta.

Har testat bl.a:

Kod:
$query = "SELECT zipcode, `long`, lat FROM postnummer_tbl JOIN postnummer ON zipcode=postnummer";

Senast redigerad av bassan den 2010-10-20 klockan 16:28
bassan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 15:45 #2
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
Vad är det för databas?

Du är ute efter en OUTER JOIN i stil med
Kod:
SELECT postnummer, long, lat
FROM postnummer_tbl, postnummer
WHERE 
postnummer.postnummer=postnummer_tbl.zipcode (+)
anpassad för Oracle
jonny är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 16:15 #3
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
Får fram rätt data tror jag, men inte med density och det är flera postnummer som kommer flera gånger =/

En bit på vägen i alla fall!

EDIT: Postnumret som returneras är samma på alla rader men inte long och lat (?)

Senast redigerad av bassan den 2010-10-20 klockan 16:24
bassan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 19:03 #4
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Kod:
SELECT `postnummer`.`postnummer`, `postnummer_tbl`.`long`, `postnummer_tbl`.`lat`, count(`postnummer`.`id`) AS density
FROM `postnummer_tbl`, `postnummer`
WHERE 
`postnummer`.`postnummer`=`postnummer_tbl`.`zipcode`
anledningen till att jag specar ett fält i COUNT() istället för * är att du behöver troligen inte räkna på exakt alla fälten i båda tabellerna utan det räcker troligen med bara ett fält.

Annars borde denna fungera minst lika bra:

PHP-kod:
<?php
$query 
"SELECT `postnummer`.`postnummer`, `postnummer_tbl`.`long`, `postnummer_tbl`.`lat`
FROM `postnummer_tbl`, `postnummer`
WHERE `postnummer`.`postnummer`=`postnummer_tbl`.`zipcode`"
;

   
$result mysql_query($query);
   
$density mysql_num_rows($result);
...
?>
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 19:41 #5
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
Tack för att du har tagit dig tid!

Dock fungerar det inte, jag kör den i phpmyadmin och får 8 miljoner(!) rader svar på frågan. Och $row[0] (postnummret) blir alltid samma. Vet inte vad det kan bero på...

Jag vill alltså enbart ha ut postnumren i postnummer (ca 400 poster totalt, varav många är samma och då ska density ska bli högre).
bassan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 19:45 #6
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Density kommer aldrig bli högre än antalet rader som returneras. Oavsett om du använder COUNT() eller mysql_num_rows()

Har du testat: SELECT DISTINCT ... ? och skippa GROUP BY.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-20, 22:28 #7
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
Testade exakt den här:

SELECT `postnummer`.`postnummer`, `postnummer_tbl`.`long`, `postnummer_tbl`.`lat`, count(`postnummer`.`id`) AS density
FROM `postnummer_tbl`, `postnummer`
WHERE
`postnummer`.`postnummer`=`postnummer_tbl`.`zipcod e`

Får exakt 1 rad:
postnummer long lat density
32767 57.1752 13.7368 8886089
bassan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-26, 11:11 #8
mephisto73s avatar
mephisto73 mephisto73 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 730
mephisto73 mephisto73 är inte uppkopplad
Mycket flitig postare
mephisto73s avatar
 
Reg.datum: Jan 2008
Inlägg: 730
Prova

Kod:
	$query = "SELECT POSTNUMMER as zip,count(*) AS density,zips.lat,zips.lon 
					FROM `postnummer`
					LEFT JOIN zips ON postnummer.postnummer = zips.zip
					GROUP BY POSTNUMMER
					ORDER BY density DESC
					LIMIT $num_rows";
mephisto73 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-26, 11:43 #9
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
bassan bassan är inte uppkopplad
Medlem
 
Reg.datum: May 2006
Inlägg: 84
Fick 21 raders svar:

Kod:
zip	density	lat	long
32767	8886070	13.7368	57.1752
16864	1	17.9345	59.363
22479	1	13.1914	55.703
25748	1	NULL	NULL
17675	1	17.7944	59.4704
14652	1	17.9009	59.2292
27231	1	14.3547	55.5566
29438	1	14.5914	56.075
16552	1	17.8441	59.3761
26061	1	12.8624	56.1042
28140	1	13.7854	56.1646
26243	1	12.8863	56.2684
12059	1	18.0519	59.3032
22355	1	13.1974	55.6814
14149	1	17.9728	59.2117
21365	1	13.0393	55.5863
16447	1	17.9369	59.4024
11420	1	18.059	59.3505
25223	1	12.7023	56.045
65	1	NULL	NULL
11737	1	18.0289	59.317
21119	1	12.984	55.613
bassan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-10-26, 14:15 #10
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
Vart hämtar du postnummeruppgifterna ifrån och hur ofta får du uppdateringar av postnummer/koordinater?
Det tar ju inte många månader innan uppgifterna är inaktuella enligt egna erfarenheter.
objx är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:27.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017