簡體   English   中英

MySQL嵌套選擇和內部聯接

[英]MySql Nested Select and inner join

我有一個有效的現有搜索。 它正在搜索表1(俱樂部),但需要從表2(鎮)中獲取一些數據。 為此,它執行兩個表的INNER JOIN。

我現在試圖將結果限制為距特定點一定距離內的結果。

這兩個表都具有稱為緯度和經度的字段,但是僅填充了Towns值,因此我需要在搜索中使用這些值。

其他兩個表在兩個表中使用相同的名稱,因此我必須指出我指的是哪個表(例如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”

在此之前,它反對內部和外部選擇中都使用的緯度和經度字段。

這里的問題是別名的范圍。 試試看:

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別名解決此問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM