1

我有一个汽车数据库,我正在尝试提取每种品牌和型号的汽车。示例:有三辆丰田卡罗拉、四辆本田思域和五辆讴歌 RSX。查询应返回一辆 Toyota Corolla、一辆 Honda Civic 和一辆 Acura RSX。我可以对此进行编码,但是查询中有很多重复的代码。

    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
)

因此,这将拉动一辆丰田 Celica GT4 和一辆日产 Skyline R33。但我重复每辆车的里程、费率和年份的条件。这个查询有两辆车我需要,但基本上我会随着时间的推移添加更多,所以我想要一种方法来添加到这个查询中,而不需要为每辆车重复 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.

我使用了,MAXIMUM auction_date+rate因为我们的要求是为每个品牌名称、型号名称和底盘只获得一个行,但要获得具有最新拍卖日期和最高费率的行。

这将生成带有结果的派生表:

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);

以这种方式,提取具有最新拍卖日期和最高费率的品牌、型号和底盘的行(但每个品牌、型号和底盘只有一行)。

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 回答
1

因为您使用LIMIT子句来限制返回的行数,并且因为该LIMIT子句在执行计划中最后(或几乎最后)被评估,所以该WHERE子句在 之前被评估LIMIT,因此 WHERE 子句必须在每个查询中重复.

还有其他返回等效结果集的方法可以避免重复 where 子句中的某些条件,但是它们不会那么有效,并且它们将无法利用ORDER BY ... LIMIT ...构造来限制返回的行。

于 2013-08-29T22:56:28.167 回答