连接两个表子查询

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;

【讨论】:

感谢您的回答。我对这个有一些好坏参半的结果。查询从位置半径返回了一些错误的行。 如果您显示正确和错误的结果将很有帮助,您可以设置更多条件以获得正确的结果。

以上是关于连接两个表子查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多表子查询

mysql子查询

Spark中对大表子查询加limit为什么会报Broadcast超时错误

MySQL------ 子查询

MySQL------ 子查询

MySQL随记 - 子查询