mysql - HardCode MySQL语法问题

标签 mysql distinct

我的一个表中的 SELECT DISTINCT 值有一个大问题。

表 1:T1

pid     box         cassette       seal      added (timestamp)
---------------------------------------------------------------
1       A1212       A01A00001     P123456    2015-01-01 12:00:01  
2       A1212       A01A00001     P123457    2015-01-01 12:00:01 
3       A1214       A01A00004     C123458    2015-01-01 12:00:01
4       A1214       A01B00005     D123459    2015-01-01 12:00:01
5       A1214       A01B00006     D123460    2015-01-01 12:00:01
6       A1212       A01B00007     E123461    2015-01-01 12:00:01    
7       A1212       A01B00007     E123462    2015-01-01 12:00:01 

表 2:T2

id   t1_pid  box     cassette      seal     error    despatched 
------------------------------------------------------------------------ 
1      3    A1214    A01A00004   C123458    false      true
2      7    A1212    A01B00007   E123462    true       false

我需要从 Table T1SELECT all DISTINCT every boxm,cassette,seal: 1. 不在 Table T2 中,最重要的是 - 仅使用 seal 哪个 pid 最高/最后添加 或者 2. 在 Table T2T2.error=trueT2.despached=false

结果应该留下T1记录

1 - 因为记录 2 具有相同的盒子、盒式磁带,但记录 1 具有较低的 pid

3 - 因为有 t2.t1_pid=3despatched=TRUE

6 - 因为记录 7 具有相同的盒子、盒式磁带,但记录 6 具有较低的 pid

记录 7 应该在结果中,因为有 t2.t1_pid=7error=TRUE

结果表:

id      box          cassette     seal
-------------------------------------------
2       A1212       A01A00001     P123457     /(rec. no 2)            
4       A1214       A01B00005     D123459     /(rec. no 4)       
5       A1214       A01B00006     D123460     /(rec. no 5)       
6       A1212       A01B00007     E123462     /(rec. no 6) 

我尝试了以下语法,如果密封编号更高,则可以。我需要更改 if t1.pid 更高的条件,但无法弄清楚。

SELECT DISTINCT T1.pid, T1.box, T1.cassette, T1.seal 

FROM T1 INNER JOIN 
(SELECT T1.box, T1.cassette, max(T1.seal) as seal FROM  

T1 LEFT OUTER JOIN T2 o ON T1.pid=o.t1_pid WHERE 
(o.id IS NULL or (o.despatched=0 )) 
GROUP BY T1.cassette, T1.box)  
as b using (cassette, box, seal) 

非常感谢您的帮助和宝贵的时间

最佳答案

此任务与 DISTINCT 无关,因为我们不是在讨论必须消除的重复记录。这更像是关于聚合(即将结果归结为独特的盒子/盒式磁带数据)。

您为 T1 记录命名了两个条件:

  1. 不在表 T2 中,最重要的是 - 仅使用 pid 最高/最后添加的密封件或
  2. 在表 T2 中,但 T2.error=true 或 T2.despached=false

条件一:

where t1.pid not in (select t1_pid from t2)
and not exists
(
  select *
  from t1 as later
  where later.box = t1.box
  and later.cassette = t1.cassette
  and later.pid > t1.pid
)

条件二:

where t1.pid in
(
  select t1_pid 
  from t2
  where t2.error = true 
  or t2.despached = false
)

但这还不够,因为我们仍然可以获得一个盒子和盒子的多个记录(一个匹配条件 1,一个匹配条件 2,或者多个匹配条件 2)。在您的评论中,您添加了第三个条件:

  1. 同一个盒子、同一个盒子的记录不能超过一条

也许你存储你的数据,这样一个盒子/盒子将始终只匹配一次两个条件,但技术上至少有可能得到重复项,所以我们应该找到一种方法去处理它。最简单的就是按盒子和盒子分组,这样可以保证每个盒子和盒子只得到一个结果记录。然后显示与之匹配的最小或最大印章。

select box, casette, max(seal)
from t1
where 
(
  t1.pid not in (select t1_pid from t2)
  and not exists
  (
    select *
    from t1 as later
    where later.box = t1.box
    and later.cassette = t1.cassette
    and later.pid > t1.pid
  )
)
or t1.pid in
(
  select t1_pid 
  from t2
  where t2.error = true 
  or t2.despached = false
)
group by box, casette;

我没有在结果中显示 ID,因为我不知道您是如何获得它们的。你说它们是 T1 ID,但它不是所选记录的 ID,例如您选择了记录 2 (pid 2),但出于我不理解的原因,您在结果中显示了 ID 为 1 的记录。

关于mysql - HardCode MySQL语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34087039/

相关文章:

java - SQL 和 JPA 错误

具有条件聚合的 MySQL UNION ALL (Full Join)

c# - 你能用 lambda 表达式创建一个简单的 'EqualityComparer<T>' 吗

sql - MySQL : Select DISTINCT/UNIQUE, 但返回所有列?

c# - 使用 LINQ 选择独特的项目

MySQL:GROUP BY 上的索引

mysql - EAV如何存储额外的字段值?

php - MySQL 存储过程比较每行的日期字段并根据 curdate() 进行更新

MySQL 5.7 | MySQL 5.7分组依据 |独特|聚合错误

sql - Count(Distinct x) 和 Group By y