MySQLのWHERE句でエイリアス列を使用するには?
質問
私はこのようなMySQLのクエリます:
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
私が出現> 0行に結果を制限したいです。これは私には非常に単純なようだが、私はそれを動作させるように見えることはできません。私はこの制限を追加しようとするたびにどんなに私はのwheresまたはHAVINGs、しようと何、私はリターンに行を取得していません。私は返されるべき私のテーブルにデータがあることを肯定的です。誰もが私がやって達成する方法を知っていますか?
<時間>私はこれを試してみたが、それはまだ動作しません。任意のアイデアなぜそれはまだ動作しません?
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
解決
私はSQL Serverとしていますように私は、MySQLと同様に慣れていないけど、T-SQLで、あなたはGROUP BY句で別名を使用することはできません(私はもともと、同様ORDER BY句を考えたが、それ以来に示されています)間違っている可能。このケースでは、GROUP BYの結果に基づいてフィルタリングしたいので、次のように私は、HAVING句を使用することになります:
SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
some_table AS q
WHERE
criterion = 'value'
GROUP BY
q.P_id
HAVING
SUM(... some SQL removed for brevity ...) > 0
ORDER BY
Occurrences DESC
LIMIT 10;
他のヒント
このクエリは、私の作品...
select order_id, sum(qty_ordered) as total_qty
from sales_flat_order_item
group by order_id
having total_qty > 10
order by total_qty desc
ああ、私はそれのための場所を見つけた。
文は以下のようになります。
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;
これは
、出現BY ORDERで正常に動作しているようです私は、凝集体がHAVING
句であるべきと考えています。しかし、確かに、私は別名が受け入れられている場合ではないと確信しています。
HAVING (Occurrences > 0)
HAVING (SUM(...some SQL removed for brevety) > 0)
また、あなたはサブクエリを使用することができます:
SELECT *
FROM (
-- your current query
) AS sub
WHERE (Occurences > 0)
SQL標準によると、列の別名は交絡迷惑であるクエリの体内では使用できません。同じは、MySQL(および他のいくつかのDBMS)の真実であるかのようにあなたがしようとしているものを考えると、それが聞こえます。おそらく、ORDER BY句で表現を繰り返す必要があります。
また、GROUP BY句は*だけではなく、主キー(ただし、論理的に、主キーを指定すると、十分なものでなければならない)にあるすべての列をリストする必要があります。