2016-06-26 11 views
0

は、私は次のようにmyEntityと呼ばれるテーブルを持っている:集合関数にはGROUP BYが必要ですか?

- id (PK INT NOT NULL) 
- account_id (FK INT NOT NULL) 
- key (INT NOT NULL. UNIQUE for given account_id) 
- name (VARCHAR NOT NULL. UNIQUE FOR given account_id) 

私は、ユーザーに主キーidを公開したくない、そしてこの目的のためにkeyを追加しました。 key種類は、アプリケーションによって手動で処理する必要があるaccounts_idの自動インクリメント列として機能します。最初にプライマリキーコンポジットを作成することを計画していましたが、テーブルは他のテーブルに結合されていましたが、それを知る前にテーブルに4つのカラムがありました。 account_id-nameaccount_id-keyと同じですが、クライアントが複数のレコードを要求した場合は、ネットワークトラフィックが最小限に抑えられ、keyが小さくなります。はい、私はそれが適切に正規化されていないことを知っていますが、私の直接の質問ではありませんが、建設的な批評のコメントを感謝します。

ごめんなさい...集計関数にGROUP BYが必要なのはいつですか?例えば、次はどうですか? https://stackoverflow.com/a/1547128/1032531には表示されません。それは必要ですか?

SELECT COALESCE(MAX(key),0)+1 FROM myEntity WHERE accounts_id=123; 

答えて

1

あなたは例として質問しませんでしたGROUP BYが必要です。説明のため、以下のように簡略化します。

SELECT MAX(key) 
    FROM myEntity 
WHERE accounts_id = 123 

なぜクエリにはGROUP BYが必要ですか?結果セットには、特定のアカウントを記述する行が1つしかないと予想されるためです。

アカウントごとに1行のすべてのアカウントを記述する結果セットが必要な場合はどうなりますか?それで、あなたはこれを使うでしょう:

SELECT accounts_id, MAX(key) 
    FROM myEntity 
    GROUP BY accounts_id 

どうしたらいいですか? accounts_idという異なる値ごとにこの結果セット内の1行が得られます。ちなみに、MySQLのクエリプランナは

SELECT accounts_id, MAX(key) 
    FROM myEntity 
    WHERE accounts_id = '123' 
    GROUP BY accounts_id 

GROUP BY句を省略し、同じクエリと同等であることを知っています。

もう一つ知っている:あなたがあなたのテーブルで(accounts_id, key)上の複合インデックスを使用している場合は、クエリプランナはMAX()MIN()集約関数に固有の非常に効率的loose index scan.でそれらを満足させるため、すべてのこれらのクエリは、ほとんど奇跡的に速くなりますが。緩いインデックススキャンは、SUM()またはAVG()または類似の機能で使用できません。厳しい索引スキャンが必要です。

+0

ありがとうございます。良い説明。複合インデックスを追加します。トピックをオフにしますが、複合キーを頻繁に使用しますか?余分な列を増やすことについて私が何を意味していたのか知​​っていますか?たぶん大したことではないでしょう。 – user1032531

+0

複合インデックスは特定の目的に役立ちます。ディスカッションについては、http://use-the-index-luke.com/をお読みください。 –

0

必要なときにのみ必要です。あなたはすべてのキーを返却したい場合たとえば、あなたは

SELECT COALESCE使用することができます(MAX(キー)を、0)+1 myEntity GROUP BY FROM

ではなく、あなたの選択をaccounts_id。しかし、あなたの選択はうまくいきます(あなたの構造には少し難しいものがあるかもしれませんが、どんな問題に対処しようとしているのかわかりません)

関連する問題