2012-09-24 21 views
0

我遇到以下问题。假设我有一个包含汽车的库存表:IN中的MYSQL元组因通配符匹配而暂停

VIN, MAKE, MODEL, PRICE 

和我有一个包含各种汽车类(例如,紧凑型,中型,SUV等)

MAKE, MODEL, CLASS 
JEEP, NULL , SUV 
FORD, EXPLORER, SUV 
TOYOTA, YARIS, COMPACT 
NULL, CUBE, COMPACT 
... 

我想知道另一个表我如何选择某个班级的数据库中的所有车辆?也许,我想知道每班有多少辆汽车存在?

我可以写这样的查询。

SELECT COUNT(*) FROM CARS WHERE (MAKE, MODEL) IN (SELECT MAKE, MODEL FROM CLASSES WHERE CLASS = 'SUV') 

这里的问题,我不会居然能应对我的数据为NULL。我想说的是,所有JEEP车型都是SUV,或者任何称为CUBE的MAKE车都是紧凑型车。

这样做可以假设没有冲突吗?我能有一个优先级设置,像所有的门廊是,除了这是做这样的事情的SUV卡宴车:

MAKE, MODEL, CLASS 
PORCHE, NULL , CAR 
PORCHE, CAYENNE, SUV 

如果这是不可能的MySQL,有没有更好的DB技术在那里那会很好。让我们假设CLASSES表将包含50K +行,而CARS表将包含5M +行。我正在寻找一种在数据库中执行这种查询的快速方法,而不需要获取数百万行来处理脚本?另外,如果它不只是品牌和型号,而且还有子型号,发动机等。

另外,我简化了一些数据,有4个层次的层次结构。

回答

1

假设品牌和型号不能同时null给定类。你可以在MySQL中使用ifnull()功能:

select cl.class, count(*) 
from cars c inner join class cl 
    on c.make = ifnull(cl.make,c.make) 
    and c.model=ifnull(cl.model,c.model) 
group by cl.class 

您可能要加上makesmodel的索引以便快速访问。由于classes使用内部联接的行数较少(如上所述)会限制返回的行数。

1

你可以写你的查询是这样的:

SELECT COUNT(*) 
FROM CARS c join 
    classes cl 
    on (c.make = cl.make or cl.make is null) and 
     (c.model = cl.model or cl.model is null) and 
     cl.class = 'SUV' 

的问题是,你可能会得到重复。所以更好的计数开始于:

select count(distinct c.vin) 
. . . 

这应该适用于您给出的两种情况,即JEEP和CUBE。

0

SELECT s.class,COUNT(*)FROM 车C,car_class小号 WHERE c.make = s.make AND c.model = s.model GROUP BY s.class

应该给你像

SUV 14 COMPACT 32 TRUCK 11 等