2013-12-23 2 views
1

항목 테이블과 범주 테이블이 있습니다. 각 항목은 사용자가 지리적으로 검색 할 수 있도록 좌표, 위도 (경도) 및 경도 (경도)와 함께 저장됩니다.서로 다른 결과를 산출하는 두 개의 동일한 수식

내가 항목을 검색 할 때 사용자와 똑같은 위도와 경도를 가진 검색어는 하나의 검색어에는 표시되지만 다른 검색어에는 표시되지 않습니다.

하나의 쿼리는 범주 (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 

이상하게 지정된 지리적 범위 내에서, 각 카테고리 내의 항목의 수를 계산 두 번째 쿼리에서 으로 찾습니다.

아이디어가 있으십니까?

Here is a fiddle to show what I mean

답변

0

번째 쿼리 distancecount()로 값을 할당한다.

첫 번째는 산술 계산을 distance으로 지정합니다.

첫 번째 작업은 원하는 작업을 수행하고 있으며 더 명확한 쿼리입니다.

편집 :

나는 또한 첫 번째 쿼리는 item_id에 의해 집계되고 있습니다. 두 번째는 외부 쿼리에서 명시 적 집계를 수행하지 않지만 모든 카테고리를 선택합니다. 이것은 버전 간의 또 다른 차이점입니다.

+0

첫 번째 쿼리는 하나의 행을 생성합니다. 따라서 count() 내에서 쿼리를 모방 한 경우 1을 반환해야합니까? 이것은 내가 앨리어스를 검색하려고 생각할 수있는 유일한 방법 이었지만 더 큰 앨리어스 안에 하나의 필드 만 가질 수는 없었습니다. - 그것이 의미가있는 경우 –

+0

첫 번째 쿼리에는 GROUP BY가 있지만 두 번째 쿼리에는 GROUP BY가 없습니다. . HAVING 절은 데이터 게시 그룹화에서 작동합니다. – gwaigh

+0

님이 item_id 그룹을 첫 번째 검색어와 동일하게 추가하려고 시도했습니다. 변경하지 않습니다. –

관련 문제