2013-03-26 249 views
0

假设我一个有一个名为“用户”,它具有以下相关栏目表:需要帮助创建MySQL查询

  • 用户名
  • 邮编

让我们假设我有一个名为“商店”的表具有以下相关列:

  • 店名
  • 邮编

让我们假设我有一个名为 “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表的表
  • 查找用户的纬度/经度
  • 找到一个给定的半径,这也是在内的所有商店‘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); 
} 

回答

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 
+0

你是否真的很看我最近的编辑。起初我并没有意识到它比我想象的要复杂得多。 – 2013-03-26 21:02:55

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

你会这么好心,看我最近编辑。起初我并没有意识到它比我想象的要复杂得多。 – 2013-03-26 21:03:33