我有一个项目表和一个类别表。每个项目都与其坐标,纬度(纬度)和经度(lon)一起保存,以允许用户在地理位置进行搜索。
当我搜索项目时,那些与用户具有完全相同的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
另一个查询选择所有类别并计算指定地理范围内每个类别中的项目数(&lt; 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 ,则会找到它!
有什么想法吗?
答案 0 :(得分:0)
第二个查询是将count()
值指定为distance
。
第一种是将算术计算分配为distance
。
第一个是做你想做的事情,这是一个更清晰的询问。
编辑:
我还注意到第一个查询是按item_id
聚合的。第二个不是在外部查询中进行显式聚合,而是选择所有类别。这是版本之间的另一个区别。