具有通配符匹配的in子句中的MYSQL元组

具有通配符匹配的in子句中的MYSQL元组,mysql,sql,database,Mysql,Sql,Database,我有以下问题。假设我有一个包含汽车库存的表: VIN, MAKE, MODEL, PRICE 我还有一张桌子,里面有各种各样的汽车(例如,紧凑型、中型、suv等) 我想知道如何选择某一类数据库中的所有车辆?也许,我想知道每类车有多少辆 我可以这样写一个查询 SELECT COUNT(*) FROM CARS WHERE (MAKE, MODEL) IN (SELECT MAKE, MODEL FROM CLASSES WHERE CLASS = 'SUV') 这里的问题是,我实际上无法处理数

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

VIN, MAKE, MODEL, PRICE
我还有一张桌子,里面有各种各样的汽车(例如,紧凑型、中型、suv等)

我想知道如何选择某一类数据库中的所有车辆?也许,我想知道每类车有多少辆

我可以这样写一个查询

SELECT COUNT(*) FROM CARS WHERE (MAKE, MODEL) IN (SELECT MAKE, MODEL FROM CLASSES WHERE CLASS = 'SUV')
这里的问题是,我实际上无法处理数据中的空值。我想说的是,所有型号的吉普车都是SUV,或者任何一款叫CUBE的车都是小型车

假设没有冲突,这能做到吗?我是否可以设置优先级,就像所有门廊都是汽车一样,但Cayenne是SUV,通过执行以下操作:

MAKE, MODEL, CLASS
PORCHE, NULL , CAR
PORCHE, CAYENNE, SUV
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'
如果MySQL不可能做到这一点,那么有没有更好的DB技术可以做到这一点。让我们假设CLASSES表将包含50K+行,CARS表将包含5M+行。我正在寻找一种在数据库中执行此类查询的快速方法,而不需要在脚本中获取数百万行来处理?还有,如果它不仅仅是品牌和型号,还有子型号、发动机等呢


此外,我还简化了数据,有4个层次结构。

您可以这样编写查询:

MAKE, MODEL, CLASS
PORCHE, NULL , CAR
PORCHE, CAYENNE, SUV
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)
. . .
这应该适用于您给出的两种情况,即吉普和立方体。

选择s.class,COUNT(*) 来自c车,s车 其中c.make=s.make c.model=s.model 按s类分组

我应该给你一些

SUV 14 紧凑型32 卡车11
等等。

假设make和model对于给定的类不能同时为
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
您可能需要在列
makes
model
上添加索引,以便更快地访问。由于
的行数较少,因此使用内部联接(如上所述)将限制返回的行数