【问题标题】:MySql Nested Select and inner joinMySql 嵌套选择和内部连接
【发布时间】:2013-10-24 19:10:20
【问题描述】:

我有一个可以正常工作的现有搜索。它正在搜索表 1(俱乐部),但需要从表 2(城镇)中获取一些数据。为此,它会执行两个表的 INNER JOIN。

我现在正试图将结果限制在距某个点一定距离内的范围内。

两个表都有名为纬度和经度的字段,但只填充了城镇值,因此我需要在搜索中使用这些值。

其他几个字段在两个表中使用相同的名称,所以我必须指出我的意思是哪个表(例如 Towns.town_key)。

为了进行距离搜索,我在内部嵌套中进行了粗略的方形框搜索,然后在外部嵌套中对结果进行了毕达哥拉斯公式。 (我不需要 Haversine 的准确性。)

无论我尝试什么,我都会在前面有表名的字段上遇到错误。不幸的是,尽管阅读了很多书,但我并不完全理解别名等的使用。

这是我的搜索:

SELECT club_key, name, Towns.town_key, town_name, Clubs.address,
sqrt(((-32.380100 - Towns.latitude)*111.133)^2 + ((147.481400 - 
Towns.longitude)*93.853)^2) AS dist FROM 

(SELECT club_key, name, Towns.town_key, town_name, Clubs.address FROM Clubs 

INNER JOIN Towns ON Clubs.town_key = Towns.town_key WHERE type = 'football' 
AND Towns.latitude BETWEEN -32.829761 AND -31.930439 AND Towns.longitude BETWEEN 146.948951 AND 148.013849) AS T1 

WHERE dist < 50 ORDER BY 6,2

最新的错误是: 无法运行查询:“字段列表”中的未知列“Towns.town_key”

在此之前,它反对在内部和外部选择中使用的纬度和经度字段。

【问题讨论】:

    标签: mysql nested inner-join


    【解决方案1】:

    这里的问题是您的别名范围。试一试:

    SELECT T1.club_key, T1.name, T1.town_key, T1.town_name, T1.address,T1.dist
    FROM 
    (
    SELECT
    sqrt(((-32.380100 - Towns.latitude)*111.133)^2 + ((147.481400 - 
    Towns.longitude)*93.853)^2) AS dist, 
    club_key, name, Towns.town_key, town_name, Clubs.address 
    FROM Clubs 
    INNER JOIN Towns ON Clubs.town_key = Towns.town_key 
    WHERE type = 'football' 
    AND Towns.latitude BETWEEN -32.829761 AND -31.930439 
    AND Towns.longitude BETWEEN 146.948951 AND 148.013849
    ) AS T1 
    WHERE T1.dist < 50 ORDER BY 6,2
    

    您正在尝试使用嵌套选择之外的别名,即Towns,它引用嵌套选择中的一个表,即Towns 表。您可以使用您的 T1 别名来解决这个问题。

    【讨论】:

    • 请问是什么连接 T1.town_key 和 Towns.town_key?和 T1.address 到 Clubs.address?
    • 试过了。现在得到错误:无法运行查询:“字段列表”中的未知列“T1.latitude”
    • Towns 表中是否存在纬度列?如果是这样,那么上面的答案应该有效....
    • 忽略它。我的错。
    • 嗯。现在收到错误:无法运行查询:BIGINT UNSIGNED value is out of range in '((((cast(-(32.380100) as signed) - cast(tbl.latitude as signed)) * 111.133) ^ 2) + (((cast(147.481400 as signed) - cast(tbl.longitude as signed)) * 93.853) ^ 2))' 我将其更改为使用 CAST 作为 SIGNED 但仍然失败。
    【解决方案2】:
    SELECT  
        T1.club_key, 
        T1.name, 
        T1.town_key, 
        T1.town_name, 
        T1.address,
        sqrt(((-32.380100 - T1.latitude)*111.133)^2 + ((147.481400 - T1.longitude)*93.853)^2) AS dist 
    FROM 
    (
        SELECT 
            Towns.latitude,
            Towns.longitude,
            club_key, 
            name, 
            Towns.town_key, 
            town_name, 
            Clubs.address 
        FROM Clubs 
        INNER JOIN Towns ON Clubs.town_key = Towns.town_key 
        WHERE 
            type = 'football' 
            AND Towns.latitude BETWEEN -32.829761 AND -31.930439 
            AND Towns.longitude BETWEEN 146.948951 AND 148.013849
    ) AS T1 
    HAVING dist < 50 
    ORDER BY 6,2
    

    在上一个答案中,我认为 WHERE 不起作用,而不是你必须使用 HAVING

    【讨论】:

    • 我尝试了 HAVING,但仍然收到错误无法运行查询:“字段列表”中的未知列“T1.latitude”
    • 在内部选择中我需要说:选择 Towns.latitude AS 纬度以便外部 T1.latitude 可以工作吗?
    猜你喜欢
    • 2013-10-08
    • 2022-09-28
    • 1970-01-01
    • 2018-10-03
    • 2019-05-05
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多