1

車のデータベースがあり、車の各メーカーとモデルの1 つを取得しようとしています。例: トヨタ カローラが 3 台、ホンダ シビックが 4 台、アキュラ RSX が 5 台あります。クエリは、Toyota Corolla、Honda Civic、および Acura RSX を 1 つずつ返す必要があります。これをコーディングすることはできますが、クエリには多くのコードの繰り返しがあります。

    SELECT
        *
    FROM
        main
    WHERE
        ( make_name = 'TOYOTA' AND model_name = 'CELICA' AND chassis = 'GT4' )
        AND
        mileage <= 100000
        AND
        rate >= '3.5'
        AND
        ( year >= 1990 and year <= 1998 )
    ORDER BY
        auction_date DESC,
        rate DESC
    LIMIT
        1
)
UNION
(
    SELECT
        *
    FROM
        main
    WHERE
        ( make_name = 'NISSAN' AND model_name = 'SKYLINE' AND chassis = 'R33' )
        AND
        mileage <= 100000
        AND
        rate >= '3.5'
        AND
        ( year >= 1990 and year <= 1998 )
    ORDER BY
        auction_date DESC,
        rate DESC
    LIMIT
        1
)

つまり、トヨタ セリカ GT4 1 台と日産 スカイライン R33 1 台を牽引します。ただし、各車の走行距離、料金、年式の条件を繰り返します。このクエリには必要な 2 台の車がありますが、基本的には時間の経過とともにさらに追加されるため、車ごとに WHERE 条件を繰り返さずにこのクエリに追加する方法が必要です。

4

2 に答える 2

1

SQL ステートメント

select 
*
from
(
SELECT make_name,
model_name,
chassis,
max(concat(auction_date,rate)) as mc
from main 
where
mileage <= 100000
        AND
        rate >= '3.5'
        AND
        ( year >= 1990 and year <= 1998 )  
group by
make_name, model_name, chassis 

) as a,
main as m
where a.make_name =m.make_name AND
a.model_name = m.model_name AND
a.chassis = m.chassis AND
a.mc = concat(m.auction_date,m.rate);

説明

make_nameこれは、 、 、model_name、およびの個別の組み合わせを含む派生テーブルを使用しchassisますMAXIMUM auction_date+rate

make_name、model_name、およびchassisごとに1つの行のみを取得する必要があるため、を使用しMAXIMUM auction_date+rateますが、最新のauction_dateと最高のレートを持つ行を取得します。

これにより、結果を含む派生テーブルが生成されます。

MAKE_NAME      MODEL_NAME   CHASSIS         MC
NISSAN         SKYLINE       GT4        0005-06-0117
NISSAN         SKYLINE       R33        0002-04-011
TOYOTA         CELICA        GT4        0005-01-0117

次に、この派生テーブルをメイン テーブルと結合しますが、条件は次のとおりです。

where a.make_name =m.make_name AND
a.model_name = m.model_name AND
a.chassis = m.chassis AND
a.mc = concat(m.auction_date,m.rate);

このようにして、製造元、モデル、およびシャシーが最新のオークション日付で最高レートの行が抽出されます (ただし、製造元、モデル、およびシャシーごとに 1 つの行のみ)。

SQLFiddle: http://sqlfiddle.com/#!2/1b5c8/2

アップデート

必要な一意のモデルを SQL で指定したいと考えています。それが私が行った理由です: WHERE model_name='GT4' など..

これは、複数のORステートメントを使用するか、CONCATand IN(または単にIN) を使用して行うことができます。

したがって、最後に次のように追加します。

 AND 
 (
  (m.model_name='CELICA' AND m.chassis='GT4') OR
  (m.model_name='TEST' AND m.chassis='TEST')
);

または追加します:

AND concat(m.model_name,'-',m.chassis) in ('CELICA-GT4','SKYLINE-GT4');

両方の例があるhttp://sqlfiddle.com/#!2/6fc09/2を参照してください。

于 2013-08-29T22:29:28.767 に答える