php - SQL查询根据与用户的接近程度来转换广告

标签 php mysql geolocation distance proximity

好的,我正在我的网站上实现广告系统。目前,我根据成员(member)注册时输入的城市存储成员(member)的纬度/经度坐标。每个广告都可以选择提供地理坐标并指定以英里为单位的半径(尽管我也希望有一个以公里为单位指定的选项)。

Sample tables
--------------users
user_id = 7
name = Charles
lat = xxxxxx.xx
lon = xxxxxx.xx

--------------ads
ad_id = 1121
advertiser_id = 42
ad_type = 728x90
proximity = 50
lat = xxxxxx.xx
lon = xxxxxx.xx

我有这段代码可以搜索我的用户数据库并返回指定距离内的用户。我想我可以编辑它,使其适合我的需要。但是,我不想显示指定距离内的所有用户,而是希望显示广告本身指定的距离内的广告,因为一个广告商可能会指定与另一个广告商不同的邻近度等。

这是我使用的原始用户邻近查询:

SELECT users.user_id
     , ( 3959 * acos( cos( radians('".$lat."') ) * 
                      cos( radians( users.lat ) ) * 
                      cos( radians( users.lng ) - 
                           radians('".$lng."') ) + 
                      sin( radians('".$lat."') ) * 
                      sin( radians( users.lat ) ) 
                    ) ) AS distance 
  FROM users 
 WHERE account_type = '1' 
   AND `active` = '1' 
HAVING distance <= '".$dist."'"

所以我想如果我可以首先创建一个查询来获取与该区域匹配并具有邻近要求的广告,然后选择它们的纬度/经度并选择当前用户的地理坐标,然后......我可以我似乎不明白这一点。然后,我将根据每个与区域匹配的广告的不同邻近设置执行多项计算。如果一则广告想要向 100 英里以内的人展示,那么计算结果将与希望其广告仅向 20 英里以内的人展示的人不同。可能有一种更简单的方法可以做到这一点。这是查询生成器应用程序可以帮助创建的东西吗?

也许是这样的?

SELECT ads.ad_id
     , ( 3959 * acos( cos( radians('".$user_lat."') ) * 
                      cos( radians( ads.lat ) ) * 
                      cos( radians( ads.lng ) - 
                           radians('".$user_lng."') ) + 
                      sin( radians('".$user_lat."') ) * 
                      sin( radians( ads.lat ) ) 
                    )) AS distance 
  FROM ads 
 WHERE ad_type = '728x90' 
   AND `active` = '1' 
HAVING distance <= ads.proximity"

最佳答案

我想出的最终查询解决方案是这样的:

SELECT ads.ad_id
     , proximity AS P, ( 3959 * acos( cos( radians('".$usr_lat."') ) * 
                                      cos( radians( ads.lat ) ) * 
                                      cos( radians( ads.lon ) - 
                                           radians('".$usr_lon."') ) + 
                                      sin( radians('".$usr_lat."') ) * 
                                      sin( radians( ads.lat ) ) 
                                    ) ) AS distance 
FROM ads 
WHERE ads.type = '728x90' 
AND ads.active = '1' 
HAVING distance <= P 
OR P='0' 
ORDER BY distance ASC

我添加了 OR P='0' 来转换未指定邻近区域的广告。

关于php - SQL查询根据与用户的接近程度来转换广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53045142/

相关文章:

javascript - 根据地理位置获取最近距离

带有 AES_DECRYPT 的 Php mysql LOWER 函数

php - VARCHAR(4) 存储多于四个的字符

php - 在 PHP 中登录 Javascript

mysql - phpMyAdmin 显示 MySQL 返回了变量声明的空结果集

mysql - 按日期排序进行分组

mysql - 与 Eloquent 查询和 phpmyadmin 不同的持续时间

php - 为 PHPUnit 的模拟对象定义类型

laravel - 将坐标保存到数据库,然后进行范围搜索

从 gis x,y 坐标获取美国邮政编码的算法