简体   繁体   中英

PHP / Mysql - ORDER BY When Using Temp Tables

I've been trying to get this to work using ORDER BY and LIMIT, but it will output everything that was put in. The ORDER BY and LIMIT does not seem to work:

$lat1 = 37.349418;
$lon1 = -121.896286;
$distance = 25;


$q = "SELECT * FROM cityname WHERE feature_class = 'A' OR feature_class = 'P'";
$r = mysql_query($q) or die(mysql_error());
while ($row = mysql_fetch_array($r)) {
$lat = trim($row["latitude"]);
$lon = trim($row["longitude"]);
$name = $row["name"];
$pop = $row["population"];
$miles = distance($lat, $lon, $lat1, $lon1, "m");
$milesrounded = round($miles, 2);
if ($miles < $distance) {
    if ($pop > 0) {
        $q2 = "CREATE TEMPORARY TABLE IF NOT EXISTS `templocation4` (
        `cityname` varchar(75) NOT NULL,
        `distance` double NOT NULL
        ) ENGINE=MyISAM DEFAULT CHARSET=latin1";
        $r2 = mysql_query($q2) or die(mysql_error());
        $q1 = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
        $r1 = mysql_query($q1) or die(mysql_error());
        $q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
        $r3 = mysql_query($q3) or die(mysql_error());
        while ($row1 = mysql_fetch_array($r3)) {
            echo $row1["cityname"];
            echo " ";
            echo $row1["distance"];
            echo "<br>";
        }
        $q5 = "DROP TABLE templocation4";
        $r5 = mysql_query($q5) or die(mysql_error());
            }
        }
}

The table cityname has > 250K entries and I'm trying to sort it down to the closest city name based on the latitude / longitude that a user has input.

Thanks.

There's an error here:

$q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
$r3 = mysql_query($q3) or die(mysql_error());

while ($row1 = mysql_fetch_array($r3)) {
    echo $row1["cityname"];   // Where is cityname defined???
    echo " ";
    echo $row1["distance"];   // Where is distance defined???
    echo "<br>";
}

$r3 only has one result column (which you haven't given a name). Are you sure you are using the correct variable because there's no way that your code should work as you have posted it.

Also your variable naming is really awful. Use meaningful names instead of $q1 , $q2 , etc...

Please check with Logic once again. "GROUP BY distance" will return single records from list of concern records. For eg if there are 100 users at 10 miles distance, your query will fetch 1st record found for 10 miles. this will NOT return all 100 records.

    $q1 = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
    $r1 = mysql_query($q1) or die(mysql_error());
    $q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
    $r3 = mysql_query($q3) or die(mysql_error());

Need to rework with your need and logic.

//determine distance function
function distance($lat, $lon, $lat1, $lon1, $unit) {

    $theta = $lon - $lon1;
    $dist = sin(deg2rad($lat)) * sin(deg2rad($lat1)) +  cos(deg2rad($lat)) * cos(deg2rad($lat1)) * cos(deg2rad($theta)); 
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $unit = strtoupper($unit);

    if ($unit == "K") {
        return ($miles * 1.609344);
    } else if ($unit == "N") {
        return ($miles * 0.8684);
    } else {
        return $miles;
    }
}

//sample latitude for testing purposes
$lat1 = 37.349418;
//sample longitude for testing purposes
$lon1 = -121.896286;
//sample distance for testing purposes
$distance = 25;

//query to select only a or p feature class
$query = "SELECT * FROM cityname WHERE feature_class = 'A' OR feature_class = 'P'";
$result = mysql_query($query) or die(mysql_error());
//create the temporary table - if it does not exist
$createtemporarytablequery = "CREATE TEMPORARY TABLE IF NOT EXISTS `templocation4` (
`cityname` varchar(75) NOT NULL,
`distance` double NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1";
$resultofcreatetemporarytablequery = mysql_query($createtemporarytablequery) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
    //gets latitude of city in database
    $lat = trim($row["latitude"]);
    //gets longitude of city in database
    $lon = trim($row["longitude"]);
    //gets cityname
    $name = $row["name"];
    //gets population of aforementioned cityname
    $pop = $row["population"];
    //determines distance from sample latitude and longitude from the latitude and longitude of cities in the cityname database
    $miles = distance($lat, $lon, $lat1, $lon1, "m");
    //round the miles to the 2nd decimal place
    $milesrounded = round($miles, 2);
    //determine if the city meets the request
    if ($miles < $distance) {
        //make sure its a populated city
            if ($pop > 0) {
                //insert stuff into temporary table
                $insertstuffintotemporarytable = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
                $resultofinsertstuffintotemporarytable = mysql_query($insertstuffintotemporarytable) or die(mysql_error());
            }
    }   
}   
//retrieve the closest 10 cities from the temporary table
$retrieve10closestcities = "SELECT * FROM templocation4 GROUP BY distance ASC LIMIT 10";
$resultofretrieving10closestcities = mysql_query($retrieve10closestcities) or die(mysql_error());
//determine how many results there are
$numrows = mysql_num_rows($resultofretrieving10closestcities);
//are there more than 0 results?
if ($numrows > 0) {
    //loops through array
    while ($row1 = mysql_fetch_array($resultofretrieving10closestcities)) {
        echo $row1["cityname"];
        echo " ";
        echo $row1["distance"];
        echo "<br>";
    }
} else {
    //echos no results found
    echo "No results found";
}
//drop temporary table
$droptable = "DROP TABLE templocation4";
$resultofdroptable = mysql_query($droptable) or die(mysql_error());

And the answer is:

San Jose 0.7
Buena Vista 2.24
Burbank 2.65
Santa Clara 3.25
Fruitdale 3.33
Alum Rock 3.97
East Foothills 4.85
Campbell 5.21
Seven Trees 5.41
Milpitas 5.48

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM