我正在尝试显示与用户数据有关的广告。
在这里,数据是经度和纬度。

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

最佳答案

如果userTABLE1(或任何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/

10-14 05:32