2013-10-24 97 views
1

我有一个现有的搜索工作正常。它正在搜索表1(俱乐部),但需要从表2(城镇)获得一些数据。要做到这一点,它会做两个表的INNER JOIN。MySql嵌套选择和内部联接

我现在试图将结果限制在距某个特定点的设定距离内。

这两个表都有称为纬度和经度的字段,但只有Towns值被填充,所以我需要在搜索中使用这些值。

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

要进行距离搜索,我在内部嵌套中进行粗略的方框搜索,然后在外部嵌套中对其结果执行一个pythagoras公式。 (我不需要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 

最新的错误是: 无法运行查询:未知列“城镇.town_key'in'field list'

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

回答

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别名来解决这个问题。

+0

有什么联系T1.town_key到Towns.town_key好吗?而T1.address到Clubs.address? – user2605793

+0

试过了。现在得到错误:无法运行查询:'字段列表'中的未知列'T1.latitude' – user2605793

+0

Towns表中是否存在纬度列?如果是这样,那么上面的答案应该工作.... –

0
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将无法正常工作,这一翻译的,你必须使用具有

+0

我试着HAVING,但我仍然得到一个错误无法运行查询:'字段列表'中的未知列'T1.latitude' – user2605793

+0

在内部选择我需要说:选择Towns.latitude AS纬度,以便外部T1。纬度会起作用吗? – user2605793