2017-04-17 109 views
1

我試圖使用與限制,以便通過內部連接(儘管通過順序不是必需做一個更新,從我讀了標準的更新不會工作......這就是我想要做的事:MySQL的更新使用INNER與ORDER BY JOIN和LIMIT

UPDATE table1 
INNER JOIN table2 
ON table1.service_id=table2.service_id 
SET table1.flags = NULL 
WHERE table1.type = 'fttc' 
AND table1.flags = 'co' 
AND table2.sync not like '%Yes%' 
AND table1.date >= $today_date 
ORDER BY table1.priority ASC 
LIMIT 20; 

它是在案件管理工具的使用和使用PHP,我想更新20張即刪除「標誌」,這樣他們可以工作的數量將作爲變量傳遞,所以我想更新20張例如最高的「優先」首先,如果可以做什麼?

+1

如果順序並不重要,那麼限制既不是吧? –

+2

在更新中排序無意義。請說明你想完成什麼。爲什麼使用限制? –

+0

沒有得到問題?請重構問題。 – Biswabid

回答

1

不應該有任何理由使用一個觀點:

UPDATE table1 t1 
    SET t1.flags = NULL 
    WHERE t1.type = 'fttc' AND 
      t1.flags = 'co' AND 
      t1.date >= $today_date AND 
      EXISTS (SELECT 1 
        FROM table2 t2 
        WHERE t2.service_id = t1.service_id AND 
         t2.sync not like '%Yes%' 
       ) 
    ORDER BY t1.priority ASC 
    LIMIT 20; 

不能使用ORDER BYLIMIT具有多表連接。但是,您可以將table2上的條件移至WHERE條款。

+0

即將測試這樣做,你能確認'1'表示在SELECT 1 FROM table2上的值嗎?謝謝 – djd

+0

這正是我所需要的。謝謝。 – djd

+0

@djd。 。 。 'EXISTS'檢查是否有*行*被返回。 '1'是一個易於輸入的任意值。 –

3

如果我正確讀取您的問題,要對其執行m是對連接產生的前20條記錄的更新,使用優先級作爲排序。您不能直接在MySQL AFAIK中的UPDATE中執行此操作,但您可以創建可更新視圖,然後更新該視圖。

CREATE VIEW yourView 
AS 
SELECT 
    t1.service_id, 
    t2.service_id, 
    t1.flags, 
    t1.type, 
    t1.date, 
    t1.priority, 
    t2.sync 
FROM table1 t1 
INNER JOIN table2 t2 
    ON t1.service_id = t2.service_id 
WHERE t1.type = 'fttc'   AND 
     t1.flags = 'co'   AND 
     t2.sync NOT LIKE '%Yes%' AND 
     t1.date >= $today_date 
ORDER BY t1.priority 
LIMIT 20; 

,然後更新這樣的觀點:

UPDATE yourView 
SET flags = NULL 
+1

我從來沒有想過這樣做,這將工作,謝謝。我知道這不可能通過標準更新來完成 - 這是我一直在尋找:-) – djd

+1

這有點MySQL的類似於針對SQL Server等其他數據庫更新CTE的替代。把它放在你的竅門中以供將來參考。 –