0

我有以下问题。假设我有一张包含汽车库存的表格:

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汽车都是紧凑型汽车。

假设没有冲突,可以这样做吗?我可以通过执行以下操作设置优先级,例如所有门廊都是汽车,除了 Cayenne 是 SUV 之外:

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

如果 MySQL 无法做到这一点,那么是否有更好的数据库技术可以胜任这一点。让我们假设 CLASSES 表将包含 50K+ 行,而 CARS 表将包含 5M+ 行。我正在寻找一种在数据库中执行此类查询的快速方法,并且不需要在脚本中获取数百万行来处理?另外,如果它不仅是品牌和型号,还有子型号、引擎等。

此外,我对数据进行了相当多的简化,有 4 个层次结构。

4

3 回答 3

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。

于 2012-09-24T21:40:53.610 回答
1

假设品牌和型号不能同时null用于给定的类。您可以ifnull()在 MySQL 中使用该函数:

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使用内部连接(如上)的行数较少,将限制返回的行数。

于 2012-09-24T22:50:58.750 回答
0

SELECT s.class, COUNT(*) FROM car c, car_class s WHERE c.make = s.make AND c.model = s.model GROUP BY s.class

应该给你类似的东西

SUV 14 紧凑型 32 卡车 11 等

于 2012-09-24T21:58:50.023 回答