0

假设我有一个名为“users”的表,其中包含以下相关列:

  • 用户名
  • 邮政编码

我们还假设我有一个名为“shops”的表,其中包含以下相关列:

  • 店铺名称
  • 邮政编码

我们还假设我有一个名为“preferred_shops”的表,其中包含以下相关列:

  • 店铺名称
  • 用户名

我们还假设我有一个名为“zipData”的表,其中包含以下相关列:

  • 邮政编码
  • 纬度

目前我可以成功运行此代码:

$lat="49.886436"; // Value should be obtained from the zipData table by doing a "SELECT FROM zipData WHERE zipcode=(users_zip_code)" or similar query 
$lon="-97.14553"; // Value should be obtained from the zipData table by doing a "SELECT FROM zipData WHERE zipcode=(users_zip_code)" or similar query
$radius=5;

$query="SELECT zipcode FROM zipData
    WHERE (POW((69.1*(lon-\"$lon\")*cos($lat/57.3)),\"2\")+
           POW((69.1*(lat-\"$lat\")),\"2\"))<($radius*$radius)";

上面的查询将成功显示在提供的纬度/经度的给定半径内的所有其他邮政编码,但我没有兴趣知道还有哪些其他邮政编码......我想知道半径内有哪些商店。

您可以提供的任何帮助将不胜感激。

==== 编辑,因为我意识到它实际上有点复杂 ====

这是我需要做的...

  • 从“用户”表中检索用户的邮政编码
  • 从 zipData 表中查找用户的纬度/经度
  • 查找给定半径内的所有商店,这些商店也在“preferred_shops”表中,给定用户在“用户名”列中

需要考虑的问题:“zipData”中的邮政编码没有空格,但“users”和“shops”中的邮政编码出于美观原因有空格……例如“A1A 1A1”格式的加拿大邮政编码

==== 编辑发布解决方案 ====

系统说我不能回答我自己的问题。这听起来很奇怪,因为在其他人的帮助下我已经找到了答案。作为一项工作,我正在编辑原始帖子。这是解决方案...

好的,所以我想通了(在回复的人的帮助下)......这就是我所做的。

它可能会更短更干净,所以如果你知道更好的方法,请随时让它变得更好。

$query = "SELECT * FROM preferred_shops
    WHERE `username`='{$_SESSION['account_name']}'
";

$result = mysql_query($query);
if (mysql_errno())
{ 
    die( "ERROR ".mysql_errno($link) . ": " . mysql_error($link) );
}

$num_rows = mysql_num_rows($result);

while($row = mysql_fetch_array($result))
{



    // Get user's preferences and postal code
    $query2 = "SELECT * FROM seekers
        WHERE `username`='{$_SESSION['account_name']}'
    ";

    $result2 = mysql_query($query2);
    if (mysql_errno())
    { 
        die( "ERROR ".mysql_errno($link) . ": " . mysql_error($link) );
    }
    $num_rows2 = mysql_num_rows($result2);

    $row2 = mysql_fetch_array($result2);

    $radius=$row2['radius']; // Didn't mention that is column was in the table but that didn't matter... the value could have come from anywhere.



    // Get user's lat/lon
    // Remove white space from the postal code
    $query3="SELECT * FROM zipData WHERE zipcode=replace('{$row2['postal']}',' ','')";
    $result3 = mysql_query($query3);
    if (mysql_errno())
    { 
        die( "ERROR ".mysql_errno($link) . ": " . mysql_error($link) );
    }
    $num_rows3 = mysql_num_rows($result3);

    $row3 = mysql_fetch_array($result3);

    $lat=$row3["lat"];
    $lon=$row3["lon"];



    $query4="SELECT shop_name FROM zipData,shops
        WHERE (POW((69.1*(lon-\"$lon\")*cos($lat/57.3)),\"2\")+POW((69.1*(lat-\"$lat\")),\"2\"))<($radius*$radius)
        AND replace(shops.zipcode,' ','') = zipData.zipcode
        AND shops.shop_name={$row['shop_name']}
    ";

    $result4 = mysql_query($query4);
    if (mysql_errno())
    { 
        die( "ERROR ".mysql_errno($link) . ": " . mysql_error($link) );
    }
    $num_rows4 = mysql_num_rows($result4);

    $num_jobs=$num_rows4;

    $i=0;
    while($row4 = mysql_fetch_array($result4))
    {
        $shopArray[$i]=$row4["shop_name"];
        $i++;
    }
    var_dump($shopArray);
}
4

2 回答 2

1

您需要加入到商店表中

SELECT shop_name FROM zipData,shops
WHERE (POW((69.1*(lon-\"$lon\")*cos($lat/57.3)),\"2\")+
       POW((69.1*(lat-\"$lat\")),\"2\"))<($radius*$radius) and
    shops.zipcode = zipdata.zipcode
于 2013-03-26T20:37:17.667 回答
0
select shopname from shops where zipcode in ( <your other working query> )
于 2013-03-26T20:37:02.593 回答