2016-05-02 2 views
1

itemテーブルのフィールドは、item_id,priority、その他のフィールドがあります。私はまたitem_priorityテーブルが2つのフィールド: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

ワンクイック編集。 'join'を 'left join'に変更する必要があります – Daniel

+0

私の受け入れられた回答を撤回して申し訳ありません - 数千もの項目でもクエリが非常に遅いです。私は他人にこれがうまくいくという誤った印象を与えたくありません。私はあなたに助けようとするための+1を与えています。ありがとう。 – stepanian

+0

テストを実行しました。私の項目には1261568のエントリがすべて優先順位5000に初期設定されています。私のitem_priorityテーブルには4948個の連続したitem_idと、ランダム値の優先順位があります。 私の最初のクエリは15秒かかりました。 2番目は実際には26秒で遅くなりました。 3.3GHzの2コアCPU。 誰かが上記の最初のクエリよりも何か速いものが出てくるかどうかを調べることに興味があります。あなたのcpuはどのように比較されますか? – Daniel