2015-09-07 90 views
0

同桌比较的属性我有一个目录,并在它的entires在附图所示 enter image description here使用SQL查询

有超过10万项,如图所示。我想要提取commit = 1的update_date大于update_date的数据。我也需要相应的行commit = 1。 我尝试了几件事情,但需要很长时间才能检索结果。什么是我可以使用的最佳SQL查询。我正在使用MySQL数据库。

编辑

我现在已经更新的表。有一个名为content_id的属性将行绑定在一起。 这样的查询给了我什么,我想

select a.* from contents a, contents b where 
a.content_id=b.content_id and 
a.update_date > b.update_date and 
a.committed=0 and b.committed=1 

我也想从致力于= 1的相应条目的一半,但他们应该在底部的行被追加,而不是垂直串联为列。

例如,我无法使用

select * from contents a, contents b where 
a.content_id=b.content_id and 
a.update_date > b.update_date and 
a.committed=0 and b.committed=1 

因为从 'B' 的结果被垂直追加。另外,有没有更好的方式来编写这个查询。如果数据库中有很多条目,这种方法非常慢。

+0

你能提供SQLFiddle一个例子吗?仅凭这些描述很难确切地说明你在寻找什么。 – duffn

+0

这对我来说没有意义。 –

+0

没有一个实际上将“提交的”值绑定在一起的列(例如,类似于“postId”),不可能编写有意义的查询。序号“id”对于识别事件是有帮助和必要的,但不足以应用您的查询。 – cars10m

回答

0

我假设在上面的例子中,对于内容id = 1,您只需要id = 2,commit = 0的update_date比commit = 1的update_date大,在这种情况下,您需要提交的数据= 1.

我使用的是Oracle,所以你需要在mysql中找到适合于row_number()函数的替换。

逻辑是

  1. 创建在现有的表视图中使用ROWNUMBER所以它会给ROWNUMBER像下面顺序按时间倒序(看你是否使用嵌套查询来做到这一点)

     ID, CONTENT_ID, COMMITED, UPDATE_DATE, ROWN 
        2 1 1 06-SEP-15 00:00:56 1 
        1 1 0 07-SEP-15 00:00:56 2 
        3 2 0 03-SEP-15 00:00:56 1 
        4 2 1 04-SEP-15 00:00:56 2 
    
  2. 现在只选择行,其中其中rown = 1和COMMITED = 1

Ť他是oracle中的查询。第二个查询c2将成为您的视图。

Oracle查询

  with c1 (id, content_id,commited,update_date) as 
     (
      select 1,1,0,sysdate from dual union 
      select 2,1,1,sysdate-1 from dual union 
      select 3,2,0,sysdate-4 from dual union 
      select 4,2,1,sysdate-3 from dual 
     ), 
      c2 as 
      (select c1.*,row_number() over(partition by content_id order by update_date) as rown from c1) 
      select id,content_id,commited,update_date from c2 
      where rown=1 and commited=1 
        ID, CONTENT_ID, COMMITED, UPDATE_DATE, ROWN 

输出

  ID, CONTENT_ID, COMMITED, UPDATE_DATE 
      2 1 1 06-SEP-15 00:06:17