0

次の関連する列を持つ「users」というテーブルがあると仮定します。

  • ユーザー名
  • 郵便番号

また、次の関連する列を持つ「shops」というテーブルがあると仮定します。

  • 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)";

上記のクエリは、指定されたlat / lonの指定された半径内にある他のすべての郵便番号を正常に表示しますが、他にどのような郵便番号があるかを知りたいとは思いません...半径内にあるショップを知りたいです。

あなたが与えることができるどんな助けでも大いに感謝されるでしょう。

====実際にはもう少し複雑であることに気付いたので編集しました====

これは私がする必要があることです...

  • 「users」テーブルからユーザーの郵便番号を取得します
  • zipDataテーブルからユーザーのlat/lonを見つけます
  • 「username」列に特定のユーザーが含まれる「preferred_shops」テーブルにもある、特定の半径内のすべてのショップを検索します

考慮すべき問題:「zipData」の郵便番号には空白がありませんが、「users」と「shops」の郵便番号には、「A1A1A1」形式のカナダの郵便番号などの見た目の理由で空白があります。

====ソリューションを投稿するために編集====

システムは、私が自分の質問に答えることは許可されていないと言っています。他の人の助けを借りて私はすでに答えを見つけたので、それは奇妙に聞こえます。回避策として、元の投稿を編集しています。これが解決策です...

わかりました、それで私はそれを理解しました(答えた人々の助けを借りて)...これは私がしたことです。

それはおそらくもっと短くてきれいになる可能性があるので、あなたがより良い方法を知っているなら、それをより良くするために自由に感じてください。

$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 に答える