gpt4 book ai didi

mysql - HardCode MySQL语法问题

转载 作者:行者123 更新时间:2023-11-28 23:42:41 24 4
gpt4 key购买 nike

我的一个表中的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com