【问题标题】:SQL Error: Every derived table must have its own aliasSQL 错误:每个派生表都必须有自己的别名
【发布时间】:2013-08-31 19:53:29
【问题描述】:

我知道有很多问题可以解决这个错误,但我已经按照他们的要求解决了我认为的问题。以下是我所做的,但我仍然收到错误。该脚本的目标是显示一定半径内的所有邮政编码。

$zip = 94550; // "find nearby this zip code"
$radius = 15; // "search radius (miles)"
$maxresults = 10; // maximum number of results you'd like

$sql = "SELECT * FROM
    (SELECT o.zipcode, o.city, o.state,
        (3956 * (2 * ASIN(SQRT(
        POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
        COS(z.latitude*0.017453293) *
        COS(o.latitude*0.017453293) *
        POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
        )))) AS distance
    FROM zipcoords z,
        zipcoords o,
        zipcoords a
    WHERE z.zipcode = ".$zip." AND z.zipcode = a.zipcode AND
        (3956 * (2 * ASIN(SQRT(
        POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
        COS(z.latitude*0.017453293) *
        COS(o.latitude*0.017453293) *
        POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
        )))) <= ".$radius."
    ORDER BY distance)
    ORDER BY distance ASC LIMIT 0,".$maxresults;

$result = mysql_query($sql) or die($sql."<br/><br/>".mysql_error());   

while ($ziprow = mysql_fetch_array($result)) {
$zipcode = $ziprow['zipcode'];
echo "$zipcode<br>";
}

我在数据库中的所有列都是 varchar。邮政编码是主要的,我会将其设为 INT,但它不允许在邮政编码的开头有 0。所以我将其更改为 varchar 并且它允许它。感谢您的帮助!

【问题讨论】:

    标签: php mysql sql zipcode


    【解决方案1】:
    $sql = "SELECT * FROM
        (SELECT o.zipcode, o.city, o.state,
            (3956 * (2 * ASIN(SQRT(
            POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
            COS(z.latitude*0.017453293) *
            COS(o.latitude*0.017453293) *
            POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
            )))) AS distance
        FROM zipcoords z,
            zipcoords o,
            zipcoords a
        WHERE z.zipcode = ".$zip." AND z.zipcode = a.zipcode AND
            (3956 * (2 * ASIN(SQRT(
            POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
            COS(z.latitude*0.017453293) *
            COS(o.latitude*0.017453293) *
            POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
            )))) <= ".$radius."
        ORDER BY distance) AS random_word_to_silence_that_error
        ORDER BY distance ASC LIMIT 0,".$maxresults;
    

    我添加了random_word_to_silence_that_error,因为在您的情况下,我认为它不会有其他用途。

    【讨论】:

      【解决方案2】:

      在选择FROM a子查询时是强制性的。

      见:http://dev.mysql.com/doc/refman/5.0/en/from-clause-subqueries.html

      只需在要从中选择的子查询末尾添加AS &lt;alias name&gt;

      ...
      ORDER BY distance) AS SOME_ALIAS
      ORDER BY distance ASC LIMIT 0
      ...
      

      【讨论】:

        猜你喜欢
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 2013-08-28
        • 2012-05-16
        • 2016-11-29
        相关资源
        最近更新 更多