2011-02-06 2 views
0

1つのフィールドのカウントを名前として他のフィールドとともに1つのテーブルからレコードをフェッチしています。私は10のレコードしか欲しくない。うち9つのレコードが私にフィールドとそのカウントを与えます。しかし、私はカウントを持つ残りのすべてのフィールドで "その他"として10レコードを表示したい。これはレコードをラッピングするようなものです。最初の9レコードをフェッチして、もう1つはmysqlの「その他」となるレコードを作成したい

次のようなものは、テーブルの内容になります。

emp_id |指定

1 |ソフトウェアEngg。

2 |ソフトウェアEngg。

3 |プロジェクトマネージャ

10以上の指定。

は、と私は、MySQL DBのSQLクエリを作成する方法はあり

Software Engineers 20 
Project Manager  5 
.... 
.... 
.... 
Others 50 

として最初の10件のレコードを表示します。私が "Others"のレコード数を追加するのは、アプリケーションレベルで速くて時間を節約するためです。または、私が効果的な方法でそれを可能にする方法を私に提案してください。

+0

標準の 'SELECT .. GROUP BY'と' UNION SELECT ... WHERE NOT EXISTS'を実行できますか? – vol7ron

答えて

1

これを試してください:あなたが表示するためにどのような9決めしかし

SELECT IF(rowNum <= 9, designation, 'Other') designation, SUM(cnt) 
FROM (SELECT designation, COUNT(*) cnt, (@row := @row + 1) rowNum 
    FROM contents, (SELECT @row := 0) dm 
    GROUP BY designation 
    ORDER BY designation 
) d 
GROUP BY IF(rowNum <= 9, designation, 'Other') 

変更GROUP BYORDER BY

+0

..私は "すべての派生テーブルは、独自のエイリアスを持っている必要があります"とエラーを取得します。 – Kammy

+0

@ kamlesh-bhure更新されました..ごめんなさい –

+0

...はいそれは動作します..上記のクエリの背後にあるロジックを共有できますか?このクエリは10000レコードで高速に動作しますか? – Kammy

1

クエリでは、LIMIT句を無視して行の総数をカウントするようにMySQLに指示するオプションを使用することができますSQL_CALC_FOUND_ROWS。行数を取得するために2番目のクエリを実行する必要がありますが、単純なクエリであり、データを取得したクエリほど複雑ではありません。

使い方はかなりシンプルです。あなたのメインクエリでは、SELECTの直後にSQL_CALC_FOUND_ROWSオプションを追加し、2番目のクエリでは、合計行数を取得するにはFOUND_ROWS()関数を使用する必要があります。クエリは次のようになります。

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10; 

SELECT FOUND_ROWS(); 
+0

ありがとう...それは動作します...私はLIMIT 9、見つけられた行がないので、従業員の数を得るためにそれを使うことができます。 – Kammy

+0

これは私の問題を完全には解決しません。 becoz私は質問を選択指定を書く、emp_designからcount(distinct emp_id)Limit 9、$ num_rows;それは私にゼロレコードを与える。 – Kammy

関連する問題