需要帮助创建一个mysql查询

时间:2013-03-26 20:31:09

标签: php mysql

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

  • 用户名
  • 邮政编码

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

  • shop_name
  • 邮政编码

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

  • shop_name
  • 用户名

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

  • 邮政编码
  • LAT
  • LON

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

$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表中找到用户的lat / lon
  • 查找给定半径范围内的所有商店,该商店也位于“preferred_shops”表中,并在“用户名”列中显示给定用户

需要考虑的问题:“zipData”中的邮政编码没有空白区域,但“用户”和“商店”中的邮政编码由于美观原因而具有空格...例如“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);
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

select shopname from shops where zipcode in ( <your other working query> )