簡體   English   中英

查詢 MySQL 數據庫並使用響應中的變量顯示

[英]Query MySQL database and display using variable from response

通過在 Stack Overflow 上閱讀這里,我做到了這一點。 我有一張滿是送貨中心的桌子。 表結構為:

name - name of hub
zip - zip code of hub
lng - longitude of hub
lat - latitude of hub
radius - delivery radius

我目前正在使用它來獲得最近的送貨中心:

$dist1 = '20';

$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("SELECT name, 
       lat, 
       lng, 
       zip, 
       radius, 
       3956 * 2 * Asin(Sqrt(Power(Sin(( :lat - lat ) * Pi() / 180 / 2), 2) + 
                                            Cos(:lat * Pi() / 180) * Cos( 
                                            lat * Pi() / 180) * 
                                            Power(Sin(( :lng - lng ) * Pi() 
                                                           / 
                            180 / 2), 2))) AS dist 
FROM   hubs 
WHERE  lng BETWEEN ( :lng - :dist1 / Cos(Radians(:lat)) * 69 ) AND ( :lng + 
                          :dist1 / Cos(Radians(:lat 
                                      )) * 69 ) 
       AND lat BETWEEN ( :lat - ( :dist1 / 69 ) ) AND ( :lat + ( :dist1 / 69 ) ) 
HAVING dist < :dist1 
ORDER  BY dist 
LIMIT  100 ");

$stmt->execute([
  'lng' => $lng,
  'lat' => $lat,
  'dist1' => $dist1
]); 

while ($row = $stmt->fetch()) {

  if ($row['radius'] >= $row['dist']){

    echo $row['name'];
    echo " - ";
    echo $row['zip'];
    echo " - ";
    echo $row['dist'];
    echo "<br>";

  }

}

我最希望從查詢中消除 $dist1 變量,而是僅顯示在該中心設置的半徑內交付的最近交付中心,僅使用 MySQL,而不是 PHP(就像我現在使用的那樣)。

我怎樣才能做到這一點?

很簡單,把你的 MySQL 改成這樣:

SELECT name, 
       lat, 
       lng, 
       zip, 
       radius, 
       3956 * 2 * Asin(Sqrt(Power(Sin(( :lat - lat ) * Pi() / 180 / 2), 2) + 
                                            Cos(:lat * Pi() / 180) * Cos( 
                                            lat * Pi() / 180) * 
                                            Power(Sin(( :lng - lng ) * Pi() 
                                                           / 
                            180 / 2), 2))) AS dist 
FROM   hubs 
WHERE  lng BETWEEN ( :lng - radius / Cos(Radians(:lat)) * 69 ) AND ( :lng + 
                          radius / Cos(Radians(:lat 
                                      )) * 69 ) 
       AND lat BETWEEN ( :lat - ( radius / 69 ) ) AND ( :lat + ( radius / 69 ) ) 
HAVING dist < radius 
ORDER  BY dist 
LIMIT  1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM