2013-02-13 117 views
0

给出像这样的查询:如何在查询WHERE子句中使用AS名称?

SELECT 
    id, 
    (SELECT COUNT(*) 
    FROM members 
    WHERE members.network_id = networks.id) AS mem_count 
FROM 
    networks 
WHERE mem_count > 2 

与此查询,在where子句中的假期,因为它不知道什么是MEM_COUNT ... where子句中为什么我不能用作为VAR?

谢谢

回答

2

你有这个概念。你只需要正确的语法。你可以重新写这样的,并有使符合ANSI查询的好处:

SELECT 
    id, 
    m.mem_count 
FROM 
    networks n 
    JOIN (
    SELECT m.network_id, 
      COUNT(*) AS mem_count 
    FROM  members 
    GROUP BY m.network_id 
) m 
    ON m.network_id = n.id 
    AND m.mem_count > 2; 
+0

此查询假定您需要来自'networks'表的更多值而不仅仅是'id'。如果不是这样,请使用depesz的答案:http://stackoverflow.com/a/14865010/42346 – bernie 2013-02-13 23:11:30

0

尝试:

SELECT 
    id, 
    (SELECT COUNT(*) as mem_count 
    FROM members 
    WHERE members.network_id = networks.id) 
FROM 
    networks 
WHERE mem_count > 2 
0

一种方法是。

Select * From (
SELECT 
    id, 
    (SELECT COUNT(*) 
    FROM members 
    WHERE members.network_id = networks.id) AS mem_count 
FROM 
    networks)) mem_counts 
WHERE mem_count > 2 

伯尼建议的加入虽然会更好。基本上,你困惑的解析器。当您使用AS来为列名称生成别名时,您将得到与分组相同的问题。

3

虽然伯尼提出正确的问题的答案,你的查询可以简化为:

SELECT 
    network_id as id, 
    count(*) 
FROM 
    members 
GROUP BY 
    network_id 
HAVING 
    count(*) > 2 

其中,作为额外的奖励,可以更快。