2012-03-09 37 views
2

我有以下MySQL的表结构,并用它作为一种记录表(entries_log)的:如何查询mysql表中的更改?

customer_id | parent_id  | child_id | quarter | month 
    xyz   |  21  | 3  | 20121 | 201201 
    xyz   |  21  | 5  | 20121 | 201201 
    xyz   |  21  | 5  | 20122 | 201204 
    xyz   |  21  | 6  | 20122 | 201204  
    xyz   |  21  | 4  | 2| 201207 
    ...   |  ...  | ....  | .... | ... 

我希望你能表的想法。现在我想跟踪每个customer_id和父母上一个季度与上一季度相关的child_id是否有任何上行变化(可能在四分之一行中存在差距,所以下面的例子是可能的,并且必须被认为是:20121 ... 20122 .... 20124)。

所以在上面我只是想有以下输出的例子:

 xyz   |  21  | 5  | 20121 | 201201 
    xyz   |  21  | 6  | 20122 | 201204 

我计算出这个查询:

SELECT e.customer_id, e.parent_id, e.child_id, e.month, e.quarter 
FROM (
    SELECT MAX(month) AS maxmonth, quarter, max(child_id) 
    FROM entries_log AS e 
    WHERE EXISTS ( 
     SELECT * 
     FROM entries_log AS f 
     WHERE (
      SELECT COUNT(*) FROM entries_log AS g 
      WHERE g.quarter = f.quarter 
      AND g.month = f.month 
     ) <= 2 
     AND e.quarter > quarter 
     AND e.child_id> child_id 
    ) 
    GROUP BY quarter 
) AS x 
INNER JOIN entries_log AS e ON e.quarter = x.quarter AND e.month = x.maxmonth; 

我读this网站,这对我帮助很大,但我仍然无法找到正确的查询。

我感谢您的帮助,谢谢!

+0

它可以使用[变量](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html)完成。坦率地说,除非你发布了巨额奖金,否则我不会告诉你代码,因为这只是太多的工作。 – Bohemian 2012-03-09 12:41:08

+0

谢谢你的回答,波希米亚人。但我不能为这个问题花钱;) – user1259201 2012-03-09 12:49:28

+0

他可能并不是指金钱,而是业力赏金。但你没有足够的业力来发布这样的奖励呢。无论如何,多好的学习机会! :-D – 2012-03-09 13:39:00

回答

0

正如波希米亚所说,这是可能的变量。 Explain Extended对如何在MySQL中实现超前/滞后有一个很好的写法。您需要添加一些额外的逻辑来处理您的确切需求,但它应该指向正确的方向。