我有 3 个表要连接在一起,以获取特定区域的用户。表的缩小示例:
USER Table (stores all user information)
ID | Name
----------
1 John
2 Joe
3 Mike
GEO (has all geo location info; including latitude and longitude; which im excluding for the example )
ID | CITY
-------------
1 | ORLANDO
2 | MIAMI
3 | DAYTONA
LOCATIONS (stores each users location; each user has multiple locations)
ID | AREA (id = user.id, geo = geo.id)
--------
1 | 1
1 | 2
1 | 3
2 | 1
3 | 1
3 | 3
我在 php 中创建了一个函数来提取具有一定半径的给定 LAT / LONG 的结果(不包括整个函数,因为它不相关):
select USER.ID as USERID, (6371 * acos(cos(radians( {$lat})) * cos(radians(g.latitude)) * cos(radians(g.longitude) - radians({$long})) + sin(radians({$lat})) * sin(radians(g.latitude)))) AS distance
from
GEO G
join LOCATIONS LOC on LOC.AREA = G.ID
join USER U on LOC.ID = USERID
HAVING distance <= {$radius}
现在的问题。这可以工作并提取所有信息,但由于用户多次出现在 LOCATIONS 表中,因此导致多次显示同一用户(即显示 100 个结果,有 15 个不同的用户)
所以我的想法是 GROUP BY USER.id; 但是,这仅匹配该用户的第一个位置;只产生2个结果。
我试过 DISTINCT;但行并不不同,因为 user.id 或 location.id 是每行的不同组合。
我也尝试过使用子查询向后工作
SELECT * from USER where id = (
select id from GEO where area = (
select id, (long trig here) as distance) from GEO)
但这不起作用,因为我必须选择 trig 语句作为距离,所以我不能只从 GEO 表中选择 id
我在试图获得独特的用户时束手无策;但仍然让它在所有用户位置搜索。我知道我可以在 php 中循环结果并重建它们;但是,此查询很容易返回数千个结果,因为每个用户的位置都显示在结果中,出于速度目的,我宁愿不这样做。
任何正确方向的帮助将不胜感激..
添加
详细说明结果问题,如果您在 ORLANDO 上运行此查询,其半径将延伸到 DAYTONA,如果用户在 DAYTONA,您会得到
USER | CITY
-----------
1 | ORLAND
1 | DAYTONA
2 | ORLANDO
3 | ORLANDO
3 | DAYTONA
这导致用户 1 和 3 重复
但是当您按 user.id 分组时,您只会得到
USER | CITY
-----------
2 | ORLANDO
它删除了用户 1 和 3,因为当它分组时,它只将他们的区域显示为 DAYTONA