2011-08-19 148 views
1

如何使用左連接編寫此查詢。由於我使用的框架不支持正確的連接,我需要重寫查詢。任何人都可以建議我一個可能的解決方案用派生表替換右連接到左連接

select Audit.history_id,Audit.field,modifiedtime,operation from Audit right join (select History.history_id from History where refid=2000000020088 order by 
modifiedtime limit 5) as Hist on Audit.history_id=Hist.history_id; 

    desc Audit 
    +------------------+------------+------+-----+---------+-------+ 
    | Field   | Type  | Null | Key | Default | Extra | 
    +------------------+------------+------+-----+---------+-------+ 
    | AUDIT_ID   | bigint(19) |  | PRI | 0  |  | 
    | HISTORY_ID  | bigint(19) |  | MUL | 0  |  | 
    | FIELD   | varchar(50)  |  |   |  | 
    | OLD_VALUE  | varchar(50)| YES |  | NULL |  | 
    | NEW_VALUE  | varchar(50)| YES |  | NULL |  | 
    +------------------+------------+------+-----+---------+-------+ 

desc History 
+---------------+-------------+------+-----+---------------------+-------+ 
| Field   | Type  | Null | Key | Default    | Extra | 
+---------------+-------------+------+-----+---------------------+-------+ 
| HISTORY_ID | bigint(19) |  | PRI | 0     |  | 
| REFID   | bigint(19) |  | MUL | 0     |  | 
| OPERATION  | varchar(50) | YES |  | NULL    |  | 
| MODIFIED_TIME | datetime |  |  | 0000-00-00 00:00:00 |  | 
+---------------+-------------+------+-----+---------------------+-------+ 
+0

查詢看起來有點怪:你總是會得到來自歷史,其中REFID = 2000000020088前五記錄沒有考慮history_id考慮。 它不應該是: 從History中選擇History.history_id,其中refid = 2000000020088和History.history_id = Audit.history_id order by modifiedtime limit 5 –

+0

會有更多的歷史條目,最初我會顯示前5個,然後是下5個,然後繼續。 – John

+0

好的,但每個審計記錄將始終與子查詢返回的前5條記錄相連。 –

回答

1

簡單地切換了左邊的關係連接:

在實踐中,明確右外連接很少使用,因爲它們可以隨時左外連接替代(用表順序切換),並提供額外功能。

來源:Wikipedia.org

0

不知道這是否會產生完全相同的輸出,你現在有一個,但它可能給你正確的觀念:

選擇Audit.history_id,Audit.field,History.modifiedtime, History.operation
從歷史
留在Audit.history_id = History.history_id
其中History.refid = 2000000020088
爲了通過History.modifiedtime

加盟審覈
1
select 
    Audit.history_id,Audit.field,modifiedtime,operation 
from  
    (
     select History.history_id 
     from History where refid=2000000020088 
     order by modifiedtime limit 5    
    ) as Hist 
    left join Audit on (Audit.history_id = Hist.history_id);