【问题标题】:Create an MySQL query创建 MySQL 查询
【发布时间】:2022-01-17 14:06:05
【问题描述】:

我有一张这样的桌子 http://sqlfiddle.com/#!9/052381/1

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

  1. VIN 以 XTA% 开头
  2. 我有注册历史:date_reg_last 值:1306440000,1506715200,1555963200。您只需要选择恰好具有这些值的 VIN 代码。如果有更多或更少的记录 - VIN 不匹配
  3. 我有一个与值1306440000,1506715200,1555963200:2,2,2匹配的owner_type。即。对于记录 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 ('УЛЬЯНОВСК Г.','С РУНГА')

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

【问题讨论】:

  • model LIKE '%1119%' 出现在查询中但不在需求列表中?
  • 如果有更多或更少的记录 - VIN 不匹配 你的意思是如果特定 VIN 有 2 行,其中一个带有列表中的日期和另一个日期不在列表中,那么这些行都不能返回? PS。显示小提琴数据的所需输出。
  • P.Salmon,对不起,我忘了加上这个条件。但这是一个简单的条件,我对此没有问题。 @Akina,你是对的。最终列表只需要包含这个 VIN:XTA111930B0149393 并且有 3 条记录,id 为:38483146、98294552 和 112853476
  • date_reg_last 是唯一有这种限制的列吗?
  • @P.Salmon,我需要从我的请求中获取按 VIN 码记录的记录总数为 3 的记录:计数 (1306440000,1506715200,1555963200) 和其他参数

标签: mysql sql request


【解决方案1】:

测试一下:

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。各项指标会有所改善。


并且有计数 (1306440000,1506715200,1555963200) - 共有 3 条记录,按 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 );

【讨论】:

  • 谢谢。此查询返回 XTA111930B0149393 记录(正确)和 XTA111930B0156231(不正确,因为表中只有一条记录(需要 3))
  • @blood73 已更新。但是该表可能包含,例如,具有相同值的 3 个重复行 - 它们匹配您的所有条件并将返回,这对您来说似乎不正确...考虑到这一点并添加相应的约束(@ 的唯一索引987654323@).
  • 我没有重复的行。例如,XTA111930B0149393 和 date_reg_last = 1306440000 是一行,XTA111930B0149393 和 date_reg_last = 1506715200 是另一行
  • @blood73 我更愿意通过(vin, date_reg_last) 创建唯一索引,以保证这种唯一性。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多