我的一个表中的 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 T1
中SELECT
all DISTINCT
every boxm,cassette,seal:
1. 不在 Table T2
中,最重要的是 - 仅使用 seal
哪个 pid 最高/最后添加
或者
2. 在 Table T2
但 T2.error=true
或 T2.despached=false
结果应该留下T1
记录
1 - 因为记录 2 具有相同的盒子、盒式磁带,但记录 1 具有较低的 pid
3 - 因为有 t2.t1_pid=3
但 despatched=TRUE
6 - 因为记录 7 具有相同的盒子、盒式磁带,但记录 6 具有较低的 pid
记录 7 应该在结果中,因为有 t2.t1_pid=7
但 error=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 记录命名了两个条件:
- 不在表 T2 中,最重要的是 - 仅使用 pid 最高/最后添加的密封件或
- 在表 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)。在您的评论中,您添加了第三个条件:
- 同一个盒子、同一个盒子的记录不能超过一条
也许你存储你的数据,这样一个盒子/盒子将始终只匹配一次两个条件,但技术上至少有可能得到重复项,所以我们应该找到一种方法去处理它。最简单的就是按盒子和盒子分组,这样可以保证每个盒子和盒子只得到一个结果记录。然后显示与之匹配的最小或最大印章。
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/