SQL查询使用相同的WHERE条件提取硬编码记录和数量

时间:2013-08-29 22:17:09

标签: mysql

我有一个汽车数据库,我正在尝试拉出每个品牌和型号汽车的一个。示例:有三辆丰田Corollas,四辆Honda Civics和五辆Acura RSX。查询应该返回一辆丰田卡罗拉,一辆本田思域和一辆讴歌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条件,因为它们将始终是相同的。

2 个答案:

答案 0 :(得分: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_namemodel_namechassis以及MAXIMUM auction_date+rate的不同组合的派生表。

我使用MAXIMUM auction_date+rate,因为我们要求每个make_name,model_name和chassis只获得一个ROW,但要获得具有LATEST 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);

通过这种方式,提取的行具有最新的aucion日期和最高速率的品牌,型号和底盘(但每个品牌,型号和底盘只有一行)。

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

<强>更新

  

我想在SQL中指定我想要的唯一模型。这就是原因   我去了:WHERE model_name ='GT4'等..

您可以使用多个OR语句或使用CONCATIN(或简称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,其中包含两个示例。

答案 1 :(得分:1)

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

还有其他方法可以返回等效的结果集,这样可以避免重复where子句中的某些条件,但它们不会那么有效,并且它们将无法使用{{1}构造以限制返回的行。