2013-03-18 40 views
-2

我有2个表。使用左连接的SQL请求

表A:(ID,类型,...)
这里ID是主键

表B:(ID,时间戳,OLD_TYPE,NEW_TYPE,...)
这里id不是主键

我想做一个sql请求,它返回的这个id与A.type不一样,最后一个(按时间戳)B.new_type。

+0

它有助于给你的问题一些背景。调用事物'A'和'B'使我们更难理解你的问题。 – 2013-03-18 13:40:51

+0

请显示样本数据和输出。否则创建sql小提琴 – DevelopmentIsMyPassion 2013-03-18 13:41:05

+0

你的问题缺乏信息。我们如何分组表B? – 2013-03-18 13:42:41

回答

1

这对你有帮助Nikita?

select a.* from A a where a.type!= (
    select b.new_type from B b order by `timestamp` desc limit 1 
) 
+0

谢谢我刚刚在括号中加了A.id = B.id。但现在它工作非常缓慢( – Nikita 2013-03-18 13:53:13

+0

我认为这可以解决我的问题,谢谢 – Nikita 2013-03-18 14:03:19

+0

:)不客气..我会更新我的答案来解决你的问题,但我现在必须离开,我会明天给你适当的查询..但我想你会在这之前得到你的回答,祝你好运。 – Patriks 2013-03-18 14:04:15

0

尝试:

select a.id, a.type 
from A a 
join (select id, max(`timestamp`) max_timestamp from B group by id) mb 
    on a.id = mb.id 
join B b on mb.id = b.id and mb.max_timestamp = b.`timestamp` 
where a.type <> b.new_type 
0

使用触发器来记录事件,有些事情是这样的(未测试的代码):

CREATE TRIGGER logger BEFORE UPDATE ON A 
FOR EACH ROW 
BEGIN 
    IF NEW.Type <> OLD.Type THEN 
    INSER INTO B(id, timestamp, old_type, new_type, ...) 
     VALUES (id, CURRENT_TIMESTAMP, OLD.Type, NEW.Type, ...) 
    END IF;   
END; 

看看在documentation进一步阅读。