按别名搜索而不显示别名

时间:2013-12-23 16:12:41

标签: mysql sql

我有一个类别表和一个项目表。

每个项目都有纬度和经度,允许我按距离搜索。

我想要做的是在选定的距离内显示每个类别以及该类别中的项目数。

E.g。在我自己的纬度和经度1英里范围内显示所有电子类电视。

这就是我正在尝试的但显然我不能在别名中有两列,并且我想知道是否有更好的方法来做到这一点?

Here is a SQL fiddle

以下是查询:

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

3 个答案:

答案 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

Demo on sqlfiddle.