2013-12-23 120 views
1

我有一个项目表和一个类别表。每个项目都与它的坐标,纬度(lat)和经度(lon)一起保存,以允许用户在地理上进行搜索。两个相同的公式产生不同的结果

当我搜索项目时,那些与用户具有完全相同纬度和经度的项目会显示在一个查询中,而不会显示在另一个查询中。

一个查询只是在一个范围内(< 1)选择一个类别(2)内的所有项目。

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 

奇怪的是,如果改变为距离所述搜索参数到就可以找到它的第二个查询!

任何想法?

Here is a fiddle to show what I mean

回答

0

第二查询分配count()值作为distance

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

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

编辑:

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

+0

但第一个查询产生一行 - 因此,如果我模仿查询内count()它应该仍然返回1?这是我可以考虑搜索别名但不显示它的唯一方式,因为我只能在更大的别名中只有一个字段 - 如果这很有意义 –

+0

请注意,您在第一个查询中有一个GROUP BY,但第二个查询中没有。 HAVING子句用于数据后期分组。 – gwaigh

+0

尝试添加group_id与第一个查询相同 - 不变 –

相关问题