我有一个类别表和一个项目表。
每个项目都有纬度和经度,允许我按距离搜索。
我想要做的是在选定的距离内显示每个类别以及该类别中的项目数。
E.g。在我自己的纬度和经度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 group by item_id
HAVING distance < 1 ) AS howmanyCat,
( SELECT name FROM categories WHERE category_id = c.parent ) AS parname
FROM categories c ORDER BY category_id, parent
答案 0 :(得分:1)
首先,从每个项目的距离计算开始,然后加入类别信息并聚合和过滤
select c.*, count(i.item_id) as numitems
from category c left outer join
(SELECT i.*, ( 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 i
) i
on c.category_id = i.category_id and distance < 1
group by category_id;
答案 1 :(得分:1)
这就是你要找的东西:
SELECT categories.name, count(items.item_id) as cnt
FROM items
JOIN categories
ON categories.category_id=items.category
WHERE ( 3959 * acos( cos( radians(52.993252) )
* cos( radians( latitude ) )
* cos( radians( longitude ) - radians(-0.412470) )
+ sin( radians(52.993252) )
* sin( radians( latitude ) ) ) ) < 1
GROUP BY categories.category_id;
这给出了:
电视| 1
答案 2 :(得分:1)
您可以将表达式用于计算嵌套SELECT
内的距离,然后将结果连接到categories
表,如下所示:
SELECT COUNT(*), cc.name FROM (
SELECT
i.item_id
, c.category_id
, ( 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 i
JOIN categories c ON c.category_id = i.category
) raw
JOIN categories cc ON raw.category_id = cc.category_id AND raw.distance < 1
GROUP BY cc.name
嵌套查询将项目和类别配对,并添加计算出的距离列。外部查询然后按距离过滤行,并按类别对它们进行分组以生成所需的输出:
COUNT(*) NAME
-------- ----
1 TVs