创建一个 MySQL 查询

Create an MySQL query

我有一个这样的table http://sqlfiddle.com/#!9/052381/1

我需要创建一个请求来查找满足以下条件的 VIN 代码:

  1. VIN 以 XTA% 开头
  2. 我有注册历史:date_reg_last 值:1306440000,1506715200,1555963200。您只需要 select 那些恰好具有这些值的 VIN 代码。如果有更多或更少的记录 - VIN 不匹配
  3. 我有一个 owner_type 匹配值 1306440000,1506715200,1555963200: 2, 2, 2. 即。对于记录 1306440000 owner_type 必须为 2,对于记录 1506715200 也必须为 2,等等。每个条目的类型可以不同。
  4. 与第三点类似,我有区域:УЛЬЯНОВСКΓ.,УЛЬЯНОВСКΓ.,С РУНГА
  5. 我有一年,应该在所有记录中。

我试过这样提出请求

SELECT * 
FROM `ac_gibdd_shortinfo` 
WHERE `vin` LIKE 'XTA%' 
  AND `model` LIKE '%1119%' 
  AND `date_reg_first` IN (0,1506715200,1555963200) 
  AND `date_reg_last` IN (1306440000,1506715200,1555963200) 
  AND `year` LIKE '2011' 
  AND `location` IN ('УЛЬЯНОВСК Г.','С РУНГА')

但它会找到具有不同数量注册记录的记录。只有一个想法:获取所有匹配的记录,然后通过附加请求按编号过滤。

测试一下:

SELECT * 
FROM `ac_gibdd_shortinfo` t0
WHERE `vin` LIKE 'XTA%' 
  AND `model` LIKE '%1119%' 
  AND `date_reg_first` IN (0,1506715200,1555963200) 
  AND `date_reg_last` IN (1306440000,1506715200,1555963200) 
  AND `year` LIKE '2011' 
  AND `location` IN ('УЛЬЯНОВСК Г.','С РУНГА')
  AND NOT EXISTS ( SELECT NULL
                   FROM ac_gibdd_shortinfo t1
                   WHERE t0.vin = t1.vin
                     AND t1.date_reg_first NOT IN (0,1506715200,1555963200) )
  AND NOT EXISTS ( SELECT NULL
                   FROM ac_gibdd_shortinfo t2
                   WHERE t0.vin = t2.vin
                     AND t2.date_reg_last NOT IN (1306440000,1506715200,1555963200) )
  AND NOT EXISTS ( SELECT NULL
                   FROM ac_gibdd_shortinfo t3
                   WHERE t0.vin = t3.vin
                     AND t3.location NOT IN ('УЛЬЯНОВСК Г.','С РУНГА') )

PS。根据指数会有所改善。


and have count (1306440000,1506715200,1555963200) - 3 records in total by VIN – blood73

SELECT vin, model, date_reg_first, date_reg_last, `year`, location 
FROM `ac_gibdd_shortinfo` t0
WHERE `vin` LIKE 'XTA%' 
  AND `model` LIKE '%1119%' 
  AND `date_reg_first` IN (0,1506715200,1555963200) 
  AND `date_reg_last` IN (1306440000,1506715200,1555963200) 
  AND `year` LIKE '2011' 
  AND `location` IN ('УЛЬЯНОВСК Г.','С РУНГА')
  AND 3 = ( SELECT COUNT(*)
            FROM ac_gibdd_shortinfo t1
            WHERE t0.vin = t1.vin );