我有一个汽车数据库,我正在尝试拉出每个品牌和型号汽车的一个。示例:有三辆丰田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条件,因为它们将始终是相同的。
答案 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_name
,model_name
和chassis
以及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
语句或使用CONCAT
和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,其中包含两个示例。
答案 1 :(得分:1)
因为您使用LIMIT
子句来限制返回的行数,并且因为LIMIT
子句在执行计划中的最后(或几乎最后)被评估,所以{{1}在WHERE
之前评估子句,因此必须在每个查询中重复WHERE子句。
还有其他方法可以返回等效的结果集,这样可以避免重复where子句中的某些条件,但它们不会那么有效,并且它们将无法使用{{1}构造以限制返回的行。