我正在尝试显示与用户数据有关的广告。
在这里,数据是经度和纬度。ADS
表:要显示的广告,其中包含广告名称,广告文字,纬度和经度
包含用户数据的表:TABLE1
:用户ID +纬度和经度,TABLE2
:用户ID +纬度和经度,TABLE3
:用户ID +纬度和经度,TABLE4
:用户ID +纬度和经度
目的是在广告的纬度和经度与4个表格中的一条或多条线的纬度和经度在10公里范围内匹配并限制3个结果时显示广告。
当将一个广告与10公里范围内的一张桌子相关联时,此功能就可以正常工作,但不能与更多表格链接。
-我对OUTER JOINS
不满意-
我的查询看起来像这样,我很确定我会出错...
SELECT ADS.name, ADS.text,
( 6371 * acos( cos( radians(TABLE1.latitude) )
* cos( radians( ADS.latitude ) )
* cos( radians( ADS.longitude )
- radians(TABLE1.longitude) )
+ sin( radians(TABLE1.latitude) )
* sin( radians( ADS.latitude ) ) ) )
AS check1,
( 6371 * acos( cos( radians(TABLE2.latitude) )
* cos( radians( ADS.latitude ) )
* cos( radians( ADS.longitude )
- radians(TABLE2.longitude) )
+ sin( radians(TABLE2.latitude) )
* sin( radians( ADS.latitude ) ) ) )
AS check2,
( 6371 * acos( cos( radians(TABLE3.latitude) )
* cos( radians( ADS.latitude ) )
* cos( radians( ADS.longitude )
- radians(TABLE3.longitude) )
+ sin( radians(TABLE3.latitude) )
* sin( radians( ADS.latitude ) ) ) )
AS check3,
( 6371 * acos( cos( radians(TABLE4.latitude) )
* cos( radians( ADS.latitude ) )
* cos( radians( ADS.longitude )
- radians(TABLE4.longitude) )
+ sin( radians(TABLE4.latitude) )
* sin( radians( ADS.latitude ) ) ) )
AS check4
FROM ADS
RIGHT OUTER JOIN TABLE1
ON TABLE1.user = ?
RIGHT OUTER JOIN TABLE2
ON TABLE2.user = ?
RIGHT OUTER JOIN TABLE3
ON TABLE3.user = ?
RIGHT OUTER JOIN TABLE4
ON TABLE4.user = ?
HAVING check1 < 10 OR check2 < 10 OR check3 < 10 OR check4 < 10
LIMIT 0,3
最佳答案
如果user
在TABLE1
(或任何TABLEn)中不是唯一的,则有可能从ADS
返回同一行的多个副本。
使用查询的方式,如果在TABLE4中找不到指定的用户,则查询将不返回任何行。我怀疑您的意思是LEFT JOIN
,其中ADS
作为驱动力表,但这只是一个猜测。我们不知道这些表包含什么,为什么其中有四个,等等。)
如果由于某种原因您正在使用RIGHT JOIN,并且如果对一个表的查询对您有用...
并且如果指定用户的TABLE1,TABLE2,TABLE3,TABLE4的每个行中都有少量行...
您可以将这些表的查询结果串联到单个派生表中,然后联接到派生表。举个例子:
SELECT ADS.name, ADS.text,
( 6371 * acos( cos( radians(t.latitude) )
* cos( radians( ADS.latitude ) )
* cos( radians( ADS.longitude )
- radians(t.longitude) )
+ sin( radians(t.latitude) )
* sin( radians( ADS.latitude ) ) )
) AS check1
FROM ADS
RIGHT
JOIN ( SELECT TABLE1.latitude, TABLE1.longitude
FROM TABLE1 WHERE TABLE1.user = ?
UNION ALL
SELECT TABLE2.latitude, TABLE2.longitude
FROM TABLE2 WHERE TABLE2.user = ?
UNION ALL
SELECT TABLE3.latitude, TABLE3.longitude
FROM TABLE3 WHERE TABLE3.user = ?
UNION ALL
SELECT TABLE4.latitude, TABLE4.longitude
FROM TABLE4 WHERE TABLE4.user = ?
) t
HAVING check1 < 10
LIMIT 3
关于mysql - Mysql加入多个具有经度和纬度的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26558024/