WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL och join (https://www.wn.se/forum/showthread.php?t=1044387)

bassan 2010-10-20 15:38

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";

jonny 2010-10-20 15:45

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 ;)

bassan 2010-10-20 16:15

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 (?)

Jonas 2010-10-20 19:03

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);
...
?>


bassan 2010-10-20 19:41

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).

Jonas 2010-10-20 19:45

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.

bassan 2010-10-20 22:28

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

mephisto73 2010-10-26 11:11

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";


bassan 2010-10-26 11:43

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


objx 2010-10-26 14:15

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.


Alla tider är GMT +2. Klockan är nu 00:02.

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