在同一查询中分组依据和Having子句

时间:2014-02-06 06:28:49

标签: mysql sql

架构:

  

地点(pid,名称,类型,lat,lng,已删除)


  

我想选择地点数,按类型和地点对它们进行分组   距离<&lt;来自特定纬度的10公里,lng

查询:

SELECT count(p.type) as count
FROM (place as p)
where p.deleted != 1
 and p.pid in
    (
    select p2.pid,
            IFNULL(acos(sin((18.5236 *pi()/180)) * sin((p2.lat*pi()/180))+cos((18.5236 *pi()/180)) * cos((p2.lat *pi()/180)) * cos(((73.8478 - p2.lng)*pi()/180))) * 6371.009, 0) AS distance
    from place p2
    having `distance` < 10
    )
group by p.type;

错误:

  

操作数应包含1列

这是因为我在子选择查询中选择了2列,即 pid 距离。但是,如果不使用第二个选择列,我该如何计算距离。

1 个答案:

答案 0 :(得分:1)

像这样重写你的剧本

SELECT  count(p.type) AS count,
        -- remove this if not necessary
        SUM(IFNULL(acos(sin((18.5236 *pi()/180)) * sin((p.lat*pi()/180))+cos((18.5236 *pi()/180)) * cos((p.lat *pi()/180)) * cos(((73.8478 - p.lng)*pi()/180))) * 6371.009, 0)) AS distance

FROM place AS p
WHERE p.deleted != 1
GROUP BY p.type
HAVING SUM(IFNULL(acos(sin((18.5236 *pi()/180)) * sin((p.lat*pi()/180))+cos((18.5236 *pi()/180)) * cos((p.lat *pi()/180)) * cos(((73.8478 - p.lng)*pi()/180))) * 6371.009, 0)) < 10