2013-06-27 24 views
2

我想從兩個表中刪除使用ORDER BY DESC和LIMIT有關係的表。從多個表中刪除使用順序和限制

DELETE FROM my_rel_table AS t1 
LEFT JOIN my_photo_table AS t2 ON t2.typeid = t1.typeid 
WHERE t1.relid = 1 
AND t1.type = 1 
ORDER BY t1.id DESC 
LIMIT 1 

很明顯,以上不起作用,因爲mysql不接受命令,並限制使用內部連接。

表結構如下:

my_rel_table 
id relid relno typeid type 
int int int int tinyint 

my_photo_table 
typeid pos_x pos_y width height 
int int int int int 
+2

什麼是sppr.ppr_id? –

+0

除上述之外,您是否嘗試從my_rel_table,my_photo_table或兩者中刪除? – Kickstart

+0

嗨,對不起,編輯了上述內容,我想從兩張表中刪除。當你有一個左連接時,排序和限制不起作用。是否有可能在一個查詢中? – Necron

回答

5

使用JOIN對一個子查詢,以獲得從my_rel_table

DELETE my_rel_table, my_photo_table 
FROM my_rel_table 
INNER JOIN 
(
    SELECT MAX(id) AS MaxId 
    FROM my_rel_table 
    WHERE relid = 1 
    AND type = 1 
) Sub1 
ON my_rel_table.id = Sub1.MaxId 
LEFT OUTER JOIN my_photo_table ON my_photo_table.typeid = my_rel_table.typeid 
WHERE my_rel_table.relid = 1 
AND my_rel_table.type = 1 

不直接測試,因爲我沒有測試數據的最高ID這樣做!

編輯 - 嘗試做前5名的夫婦,但同樣沒有測試

DELETE my_rel_table, my_photo_table 
FROM my_rel_table 
INNER JOIN 
(
    SELECT id 
    FROM my_rel_table 
    WHERE relid = 1 
    AND type = 1 
    ORDER BY id DESC 
    LIMIT 5 
) Sub1 
ON my_rel_table.id = Sub1.id 
LEFT OUTER JOIN my_photo_table ON my_photo_table.typeid = my_rel_table.typeid 
WHERE my_rel_table.relid = 1 
AND my_rel_table.type = 1 

或者以不同的方式。

DELETE my_rel_table, my_photo_table 
FROM my_rel_table 
INNER JOIN 
(
    SELECT id, @Counter:[email protected]+1 AS ItemCounter 
    FROM my_rel_table 
    CROSS JOIN (SELECT @Counter:=0) Sub1 
    WHERE relid = 1 
    AND type = 1 
    ORDER BY id DESC 
) Sub1 
ON my_rel_table.id = Sub1.id 
AND Sub1.ItemCounter <= 5 
LEFT OUTER JOIN my_photo_table ON my_photo_table.typeid = my_rel_table.typeid 
WHERE my_rel_table.relid = 1 
AND my_rel_table.type = 1 
+0

完美搭配!但是..如果我想限制刪除5行數據呢?你能否向我解釋一下,這樣我就可以更多地理解它是如何工作的,而不是我,只是「複製和粘貼它」?我非常感謝你的幫助! – Necron

+0

刪除my_rel_table中的前5個(以及從my_photo_table中匹配的行)是相當複雜的。可能需要使用用戶變量來完成。我會盡力去解決問題。 – Kickstart

+0

第二種方式應該可以正常工作。 +1 –