【问题标题】:MYSQL Tuple in IN CLause with wildcard matching带有通配符匹配的 IN Clause 中的 MYSQL 元组
【发布时间】:2012-09-24 21:12:24
【问题描述】:

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

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 个层次结构。

【问题讨论】:

    标签: mysql sql database


    【解决方案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 的行数较少,因此使用内连接(如上)将限制返回的行数。

    【讨论】:

      【解决方案2】:

      你可以这样写你的查询:

      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。

      【讨论】:

        【解决方案3】:

        SELECT s.class, COUNT(*) FROM car c, car_class s 在哪里 c.make = s.make 和 c.model = s.model GROUP BY s.class

        应该给你类似的东西

        SUV 14 紧凑型 32 卡车 11 等等

        【讨论】:

          猜你喜欢
          • 2014-09-17
          • 2018-05-31
          • 2019-02-26
          • 1970-01-01
          • 2012-10-03
          • 2021-03-27
          • 2014-08-26
          • 1970-01-01
          • 2014-04-20
          相关资源
          最近更新 更多