两个相同的公式产生不同的结果

时间:2013-12-23 15:15:05

标签: mysql sql

我有一个项目表和一个类别表。每个项目都与其坐标,纬度(纬度)和经度(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 ,则会找到它!

有什么想法吗?

Here is a fiddle to show what I mean

1 个答案:

答案 0 :(得分:0)

第二个查询是将count()值指定为distance

第一种是将算术计算分配为distance

第一个是做你想做的事情,这是一个更清晰的询问。

编辑:

我还注意到第一个查询是按item_id聚合的。第二个不是在外部查询中进行显式聚合,而是选择所有类别。这是版本之间的另一个区别。