11

3列のテーブルがあります:

userid   mac_address   count

1 人のユーザーのエントリは次のようになります。

57193   001122334455   42
57193   000C6ED211E6   15
57193   FFFFFFFFFFFF   2

このユーザーが「よく使用する」と見なされる MAC のみを表示するビューを作成したいと考えています。たとえば、そのユーザーの最も使用されている MAC アドレスと比較して、使用されている MAC アドレスが 10% 未満である MAC を除外したいと考えています。さらに、ユーザーごとに1行が必要です。これは、GROUP BY、HAVING、および GROUP_CONCAT を使用して簡単に実現できます。

SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)

実際、結果は次のとおりです。

57193   001122334455,000C6ED211E6   42

ただし、ビューにカウント列を表示したくありません。しかし、SELECT ステートメントからそれを取り出すと、次のエラーが発生します。

#1054 - Unknown column 'count' in 'having clause'

ビューに厄介なカウント列を強制することなく、この操作を実行できる方法はありますか? おそらく内部クエリを使用して実行できることはわかっていますが、パフォーマンス上の理由からそれを避けたいと思います。

あなたの助けは大歓迎です!

4

1 に答える 1

11

選択リストの列名を明示的に参照しているためHAVING、希望することはできません。
ただし、必要な行のみを返す選択の副選択として選択を使用できます。

SELECT a.userid, a.macs
FROM
(
    SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
    FROM mactable
    GROUP BY userid
    HAVING count*10 >= MAX(count)
) as a

更新:
MySQL の制限により、これは不可能ですが、Oracle などの他の DBMS では機能します。1 つの解決策は、サブクエリのビューを作成することです。別の解決策はよりきれいに見えます:

CREATE VIEW YOUR_VIEW (userid, macs) AS
SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)

useridこれにより、列のみを返すビューが宣言されますmacsが、基になるSELECTステートメントはこれらの 2 つよりも多くの列を返します。
DBMS 以外の MySQL がこれをサポートしているかどうかはわかりませんが...

于 2011-07-14T11:50:54.537 に答える