2015-09-07 87 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