0

次のようなクエリが与えられた場合:

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

このクエリでは、mem_count が何であるかがわからないため、where 句が壊れます... where 句で as var を使用できないのはなぜですか?

ありがとう

4

4 に答える 4

3

バーニーは質問に対する正しい答えを提案しましたが、クエリは次のように簡略化できます。

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

追加のボーナスとして、これはより高速になる可能性があります。

于 2013-02-13T23:07:38.080 に答える
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;
于 2013-02-13T22:58:14.193 に答える
0

試す:

SELECT 
  id, 
  (SELECT COUNT(*) as mem_count
   FROM members 
   WHERE members.network_id = networks.id)
FROM 
  networks
WHERE mem_count > 2
于 2013-02-13T22:59:34.567 に答える
0

1つの方法があります。

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 を使用して列名に別名を付けると、group by または order by で同じ種類の問題が発生します。

于 2013-02-13T23:07:03.060 に答える