2016-05-02 37 views
1

我有一個item表,它具有字段item_id,priority和一堆其他字段。我也有一個item_priority表,它有兩個字段:item_idpriority。並非item表中的每個項目都有item_priority中的匹配記錄。備用值加入更新

我想更新item表來根據item_priority表設置優先級。對於所有沒有匹配的項目,我希望priority爲-1。

我可以運行以下命令:

update item set priority = -1 

update item 
join item_priority on item.item_id = item_priority.item_id 
set item.priority = item_priority.priority 

這將讓我我需要什麼。但是有沒有辦法在單個查詢中執行此操作?

注意:我知道這個設計並不是最優的,但是它必須以這種方式出於不同的原因。我想要的只是在單個查詢中完成此操作,而無需重新設計表格。

回答

2
update item 
left join item_priority on item.item_id = item_priority.item_id 
set item.priority = IF (item_priority.priority is null, -1, item_priority.priority) 

這是另一種選擇。這對你來說快嗎?

update item 
join (select item.item_id, ifnull(item_priority.priority, -1) as priority 
     from item 
     left join item_priority on item.item_id = item_priority.item_id) new_priority on item.item_id = new_priority.item_id 
set item.priority = new_priority.priority 
+0

一個快速編輯。 '加入'需要更改爲'左連接' – Daniel

+0

對不起,我撤回了我接受的答案 - 即使對於數千個項目,查詢也非常慢。我不想給別人錯誤的印象,認爲這有效。我給你+1幫助。謝謝。 – stepanian

+0

只是跑了一個測試。我的項目有1261568個條目最初設置爲優先級5000。我的item_priority表有4948個非連續的item_id和具有隨機值的優先級。 我的第一個查詢需要15秒。第二秒實際上是26秒慢。 3.3GHz 2核cpu。 我會很高興看到有人提出了比上面第一個查詢更快的內容。你的CPU比較如何? – Daniel