pdo-lat-lon多in子句搜索

pokxtpni  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(337)

我不知道如何构造这个sql查询。
我有三张table。
用户表
用户id
名称
图片等
标签参考表
用户id
标签id
地理位置表
用户id
吉奥拉特
地龙
我需要做的是根据位置和与他们相关联的标签来查找用户。我有两个查询分别工作。
这是我用于位置查询的内容:

$sql_search_people = "SELECT user_id, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation 
        HAVING distance < '25'";

然后我需要从tag\ ref表中按tag\ id筛选结果。用户可以通过多个标签进行搜索。我在这里单独做了这件事:

$sql_search_people = "SELECT b.user_id, b.name, b.picture, b.tagline, b.genres FROM tag_ref AS a LEFT JOIN users AS b ON a.user_id = b.user_id WHERE a.tag_id IN ($in) GROUP BY a.user_id";

现在我只需要弄清楚如何将这两个组合到一个查询中。我搞不懂!我尝试过连接和子查询,但我真的很难理解这些。
任何帮助都将不胜感激。

更新

在玩了更多的游戏之后,我成功地让它工作了:

$sql_search_people = "SELECT a.user_id, b.user_id, c.user_id, c.tag_id, b.name, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation AS a RIGHT JOIN tag_ref AS c ON a.user_id = c.user_id RIGHT JOIN users AS b ON a.user_id = b.user_id WHERE c.tag_id IN ($in) HAVING distance < '25' ";

当然,如果一个用户有多个标签,那么它会复制结果。当我将groupby添加到groupby user\ id时,查询会失败吗?

egdjgwm8

egdjgwm81#

我有一个想法,使用第一个查询是一个临时表来调用第二个查询:

SELECT b.user_id, b.name, b.picture, b.tagline, b.genres FROM tag_ref AS a LEFT JOIN users AS b ON a.user_id = b.user_id,  (SELECT user_id, ( 3959 * acos( cos( radians(?) ) * cos( radians( geolat ) ) * cos( radians( geolon ) - radians(?) ) + sin( radians(?) ) * sin( radians( geolat ) ) ) ) AS distance FROM geolocation
HAVING distance < '25') as location WHERE a.tag_id IN ($in) GROUP BY a.user_id

相关问题