2013-12-23 157 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與第一個查詢相同 - 不變 –

相關問題