2012-03-14 5 views
2

単一のSQL文がこのようなことを行うことができるかどうか不思議です。文を照会する文は別個の列に基づいて返される行を制限する

私はこのようなものののテーブルを持っている:

name, manufacturer, value 

私は他の基準のクエリに基づいて、各メーカーのtop x数を一覧表示したいと思います。例えば

SELECT name, manufacturer, value 
from table 
where value<100 
order by manufacturer 

しかし、理想的に私は、各メーカーからfirst 10を返すために、たとえば、たいと思います。 first 10の後に返されたテーブルを解析してレコードを無視するスクリプトを書くことはできますが、自動的に行うクエリを作成する方法はありますか?

私はこれがあなたのために働くと思う
+0

10のレコードの条件は?つまり、条件の後に値のソート順を指定します。それはトップ10の価値ですか? – Aerik

答えて

0
SELECT name,manufacturer,value 
FROM YOURTABLE 
LIMIT 0,x; 
+0

上記はレコードの総数を制限します。私はそれぞれのメーカーからxを求めます。 –

2

SET @Manufacturer = ''; 
SET @RowNum = 1; 

SELECT Name, 
     Manufacturer, 
     Value 
FROM ( SELECT @RowNum := IF(@Manufacturer = Manufacturer, @RowNum + 1, 1) AS RowNumber, 
        Manufacturer, 
        Name, 
        Value, 
        @Manufacturer := Manufacturer 
      FROM Item 
      ORDER BY Manufacturer, Name DESC 
     ) Item 
WHERE RowNumber <= 10 

これは名前順最初の10を返し、クエリがどの決定方法を変更するサブクエリでORDER BY句を変更する必要があります各メーカーの「最初の」10レコードです。

+0

興味深い。したがって、これらのタイプの問合せは、SQL自体ではなく、スクリプトによって処理されることを想定しても安全です。上記のコードはMySQLと互換性がありますか? –

+0

はいこれはMySQLと互換です。この[SQL Fiddle](http://sqlfiddle.com/#!2/e6050/9)を使用してテストしました。これは、SQL内またはプログラム内で最もうまく処理されるかどうかについて、個々の状況に完全に依存します。私は、SQL Serverで動作するように、MySQLがこのような関数でどれくらいうまく機能しているのかよくわかりませんが、SQL ServerではSQL内でそれをやっています。なぜ必要以上に行を処理し、アプリケーションに必要以上に多くのデータを送るのか。しかし、最終的にはテストの代用品はありません。特定の状況に最適なソリューションを選択します。 – GarethD

+0

それはちょうど私に起こりました、あなたはまた、内側のクエリを制限10で持つことでそれを行うことができますか?選択したMFGを外側に選択するのと同じように、選択されたMFGを使用して内側のクエリに10を引き込みます。私はネストされたSELECTを使ってSQLで多くの作業をしていません –

関連する問題