连接两个表子查询
Posted
技术标签:
【中文标题】连接两个表子查询【英文标题】:Join two tables subquery 【发布时间】:2017-12-18 18:48:57 【问题描述】:我正在尝试从users2
表中获取*
,其中用户的位置在给定半径内。
位置查询在user_location2
表上运行良好。
SELECT uid, ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( `lat` ) ) ) )
AS distance FROM user_location2
HAVING distance <= 25 ORDER BY time_stamp
内部连接在没有位置子查询的情况下也能正常工作
SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
我只是无法将两者结合起来。这是我当前的查询,它只是返回所有行,所以我显然做错了什么。
SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE EXISTS (SELECT NULL, ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( `lat` ) ) ) )
AS distance FROM user_location2
HAVING distance <= 5 ORDER BY time_stamp)
包括编辑
我希望添加第三个表 (user_like) 以消除许多不应该包含在结果中的可能行。
假设脚本正在为 user_id = 88 运行
所以基本上用户 89、90 和 91 会在位置半径范围内,但不会包含在结果中,因为用户 88 已经喜欢他们。
【问题讨论】:
【参考方案1】:试试这个...
SELECT users2.*
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( `lat` ) ) ) ) < = 5
ORDER BY time_stamp
两个表之间的连接很好。计算列已添加到 select 子句和 where 子句中,因为过滤器需要它。将其放在视图中会更容易,这样如果您需要更改它,可以在一个地方完成。
编辑:从 SELECT 中删除了计算,因为我相信您不需要看到它。只需将其留在 WHERE 子句中,因为需要对其进行过滤。
【讨论】:
太棒了!似乎运作良好。是否可以从 users2 中抛出一些 WHERE 子句?比如 WHERE users2.age > 25 是的。只需在条件之前或之后添加它们,并根据需要使用 AND 或 OR。 有机会可以看看我编辑的问题吗?我真的很感激。 如果您有更多后续问题,请提出另一个问题。 @b_the_builder 您可以在查询中添加 uid1 = 88 和 uid2 != 88。【参考方案2】:你可以试试这个:
SELECT *
FROM users2 A
LEFT JOIN user_location2 B
ON B.uid = A.id
WHERE ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( `B.lat` ) ) * cos( radians( `B.lon` ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( `B.lat` ) ) ) ) > 25;
【讨论】:
感谢您的回答。我对这个有一些好坏参半的结果。查询从位置半径返回了一些错误的行。 如果您显示正确和错误的结果将很有帮助,您可以设置更多条件以获得正确的结果。以上是关于连接两个表子查询的主要内容,如果未能解决你的问题,请参考以下文章