2015-11-01 22 views
3

EDITED不同的值:MYSQL高级选择与corressponding ID其不在anothe表

我已经从我的表的一个SELECTDISTINCT值一个巨大的问题。

表1:T1

pid  thing  sub-thing  tnumber  
------------------------------------------- 
1  A1212  A01A00001  123456  
2  A1212  A01A00002  123457  
3  A1212  A01A00002  123458  
4  A1214  A01B00001  123459  
5  A1214  A01B00002  123460   
6  A1214  A01B00001  123461   
7  A1217  C01A00001  123462  

表2:T2

id  pid  thing  sub-thing   tnumber h1 
-------------------------------------------------------------- 
1   3   A1212  A01A00002  123458 False 

我需要SELECTT1所有DISTINCT子事情每一件事情未在表T2,最重要的 - 只有最高的tnumber(例如max(id))。

结果应离开记录2,4从T1,因为有相同的子事物具有较高的tnumber和当然离开记录3从T1,因为它在T2。 最终的结果应该是这样

id  thing  sub-thing  tnumber  
------------------------------------------- 
1  A1212  A01A00001  123456     
5  A1214  A01B00002  123460   
6  A1214  A01B00001  123461   
7  A1217  C01A00001  123462 

感谢大家在这里,我已经试过的语法是:

SELECT DISTINCT t1.pid, t1.thing, t1.subthing, t1.tnumber 
FROM t1 INNER JOIN 
(SELECT t1.thing, t1.subthing, max(t1.tnumber) as tnumber FROM t1 LEFT OUTER JOIN t2 o ON t1.pid=o.pid WHERE o.pid IS NULL 
AND t1.added>'2015-10-31' 
GROUP BY t1.subthing, thing) 
as b using (subthing, thing, tnumber) ; 

现在我需要添加一个条件,从T1的记录,其中T1.pid不在T2.pidt2.h1=false不应给最终结果。

非常感谢您的帮助。

+0

我没有得到为什么2,4被排除在外..他们的'子事物'是不相同的 –

+0

因为已经有相同的子事物(ID 3/6)与更高的Tnumber –

回答

0

尝试类似的东西?

SELECT * 
FROM T1 
WHERE CONCAT_WS('-', thing, `sub-thing`, tnumber) IN 
(SELECT CONCAT_WS('-', thing, `sub-thing`, max_tnumber) 
FROM (
    SELECT MAX(tnumber) AS max_tnumber, thing, `sub-thing` 
    FROM T1 
    WHERE T1.`sub-thing` NOT IN (SELECT `sub-thing` FROM T2) 
    GROUP BY thing, `sub-thing` 
) as view 
); 
2

此查询将返回MAX(ID),每subthing:

SELECT subthing, MAX(id) AS max_id 
FROM t1 
WHERE subthing NOT IN (SELECT subthing FROM t2) 
GROUP BY subthing; 

(我认为这要排除存在于T2所有subthings)这

然后查询您可以检索所有其他列的最大ID:

SELECT t1.* 
FROM t1 
WHERE ID IN (
    SELECT MAX(id) AS max_id 
    FROM t1 
    WHERE subthing NOT IN (SELECT subthing FROM t2) 
    GROUP BY subthing 
) 

请看小提琴here。如果希望上帝保佑更好的性能,你可以用LEFT JOIN尝试:

SELECT ta.* 
FROM 
    t1 AS ta LEFT JOIN t1 AS tb 
    ON ta.subthing=tb.subthing 
    AND ta.id<tb.id 
WHERE 
    ta.subthing NOT IN (SELECT subthing FROM t2) 
    AND tb.id IS NULL 

(请确保t1.id被索引,并且也subthing两个表的索引应该帮助)。

+0

ID总是索引,所以t1.id将会。 –

+0

@fthiella,thanx求助。它看起来正确。我只需要在我的本地数据库上进行测试。给我一段时间:) 是否加入比子查询更快? –

+0

工作几乎没问题 - 当相同的子事件大于2时没有留下一些记录。 –

1

尝试左外连接:

select distinct t1.id, t1.thing, t1.subthing, t1.tnumber from t1 inner join (SELECT t1.thing, subthing, max(t1.tnumber) as tnumber 
FROM t1 left outer join t2 using (subthing) where t2.subthing is NULL GROUP BY subthing, thing) as b using (subthing, thing, tnumber) ; 

创建串联指数:

create index index_name t1(subthing, thing, tnumber); 
+0

这会产生正确的结果! –

+0

即使有一件事情有很多重复的子事物(当然有唯一的Tnumber),结果是正确的。谢啦! –

+0

很高兴它的工作原理:-) –

0

我在下面LFJ语法中出现的一个问题:

SELECT t1.id, t1.thing, subthing, max(t1.tnumber) as tnumber 
FROM t1 left outer join t2 using (subthing) where t2.subthing is NULL GROUP BY subthing, thing; 

将导致

4  A1214  A01B00001  123459 

6  A1214  A01B00001  123461 

ID = 4是代替该子事物的第一ID,但号123461是从最大tnumber但最大tnumber是在记录id = 6。

我觉得语法应该先从:

SELECT max(t1.id), t1.thing (...) 
+0

其实这是正常的,你不能用它来做你想做的事情,因为你不是通过id进行分组而是不想做的,所以它需要一些随机的id,而不是匹配查询的其余部分。 –

+0

这就是为什么我给你一种不同的方法,首先,但我不知道你是否尝试过...... –

0

一些修改,我基于@LFJ语法做。

'changed `t1.id` column to `t1.pid`' 
'changed `t2.id_table_t1` column to `t2.pid`' 
'and JOINed tables via `pid` columns' 
SELECT DISTINCT t1.pid, t1.thing, t1.subthing, t1.tnumber 
FROM t1 INNER JOIN 
(SELECT t1.thing, t1.subthing, max(t1.tnumber) as tnumber FROM t1 LEFT OUTER JOIN t2 o ON t1.pid=o.pid WHERE o.pid IS NULL 
AND t1.added>'2015-10-31' 
GROUP BY t1.subthing, thing) 
as b using (subthing, thing, tnumber) ; 

结果是相同的,但对比是通过pid列(旧ID),不tnumber列,这意味着即使在T2.tnumber是任何值,结果是一样的:)

我想这就是结局。也许它会在未来帮助别人。 非常感谢。