我有一个项目表和一个类别表。每个项目都保存有其坐标,纬度(lat)和经度(lon),以允许用户进行地理搜索。
当我搜索商品时,那些与用户的经度和纬度完全相同的商品会在一个查询中显示,而在另一个查询中却不显示。
一个查询仅选择类别(2)中范围(<1)内的所有项目。
SELECT *, c.name as category, c.category_id as CATid,
( 3959 * acos( cos( radians(52.993252) )
* cos( radians( i.latitude ) )
* cos( radians( i.longitude ) - radians(-0.412470) )
+ sin( radians(52.993252) )
* sin( radians( i.latitude ) ) ) ) AS distance
from items i
join categories c on i.category=c.category_id
where i.category=2 group by i.item_id
HAVING distance < 1
order by distance
另一个查询选择所有类别,并计算指定地理范围(<1)内每个类别中的项目数
SELECT *, ( SELECT ( count( 3959 * acos( cos( radians(52.993252) )
* cos( radians( latitude ) )
* cos( radians( longitude )
- radians(-0.412470) )
+ sin( radians(52.993252) )
* sin( radians( latitude ) ) ) )) AS distance
FROM items
WHERE category = category_id
HAVING distance < 2 ) AS howmanyCat,
( SELECT name FROM categories WHERE category_id = c.parent ) AS parname
FROM categories c ORDER BY category_id, parent
奇怪的是,如果您在第二个查询中将搜索距离参数更改为2,它将找到它!
有任何想法吗?
第二个查询将count()
值分配为distance
。
首先是将算术运算分配为distance
。
首先是做您想做的事,这是一个更清晰的查询。
编辑:
我还注意到,第一个查询是由聚合的item_id
。第二个方法不是在外部查询中进行显式聚合,而是选择所有类别。这是版本之间的另一个区别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句