gpt4 book ai didi

mysql - SQL - 基于条件的唯一结果

转载 作者:行者123 更新时间:2023-11-29 20:56:33 24 4
gpt4 key购买 nike

制作经销商定位器,人们可以在其中搜索附近的经销商。我希望它以这样的方式工作:如果经销商在该人附近有多个分支机构,则仅显示最近的分支机构。因此,“名称”字段在结果中应该是唯一的,与具有相同“名称”字段的其他行相比,显示的结果与搜索者的距离最近。我还只想要显示的最接近的 5 个经销商(按经销商级别或奖牌排序)。现在我有以下内容:

$query = sprintf("SELECT
name, address, contact, image, medal, phone, email, website, lat, lng,
( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance
FROM dealers
HAVING distance < 60
ORDER BY medal, distance
LIMIT 0 , 5",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
$result = mysql_query($query);

根据我读到的内容,听起来我需要做类似的事情:

SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY distance) AS num
FROM dealers)a
WHERE a.num = 1

或者类似的东西,但我无法让它正常工作。任何关于我如何让它发挥作用的见解将不胜感激。

最佳答案

获取每个经销商的最小距离,其中取前五个。然后再次从表中选择以获得完整的记录,但只取那些已经由经销商和距离识别的记录。

WITH 子句会很有帮助,但 MySQL 不支持它。嗯,...

SELECT
name, address, contact, image, medal, phone, email, website, lat, lng,
( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance
FROM dealers
WHERE (name, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) )) IN
(
SELECT
name, min( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance
FROM dealers
GROUP BY name
HAVING distance < 60
ORDER BY distance
LIMIT 5
)
ORDER BY distance, medal;

关于mysql - SQL - 基于条件的唯一结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37578395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com