Chciałbym jednak, by część instrukcji wykonała się warunkowo i nie bardzo mam pomysł jak poprawić moje zapytania
Pierwsza wersja
LOCK TABLE rbx_category WRITE; SELECT @toMoveLft := lft, @toMoveRgt := rgt, @toMoveWidth := rgt - lft + 1 FROM rbx_category WHERE category_id = 58; SELECT @toReplaceLft := lft, @toReplaceRgt := rgt, @toReplaceWidth := rgt - lft + 1 FROM rbx_category WHERE rgt = @toMoveLft - 1; UPDATE rbx_category #1 SET rgt = rgt - @toReplaceWidth WHERE rgt BETWEEN @toMoveLft AND @toMoveRgt; UPDATE rbx_category #2 SET rgt = rgt + @toMoveWidth WHERE lft BETWEEN @toReplaceLft AND @toReplaceRgt; UPDATE rbx_category #3 SET lft = lft - @toReplaceWidth WHERE rgt BETWEEN @toReplaceLft AND @toReplaceLft + @toMoveWidth; UPDATE rbx_category #4 SET lft = lft + @toMoveWidth WHERE rgt BETWEEN ( @toMoveRgt - @toMoveWidth ) AND @toMoveRgt; UNLOCK TABLES;
Chciałbym by UPDATE'y #1 - #4 wykonały się tylko w sytuacji gdy @toReplaceWidth będzie większe od zera.
Wymyśliłem więc coś takiego:
LOCK TABLE rbx_category WRITE; SELECT @toMoveLft := lft, @toMoveRgt := rgt, @toMoveWidth := rgt - lft + 1 FROM rbx_category WHERE category_id = 58; SELECT @toReplaceLft := lft, @toReplaceRgt := rgt, @toReplaceWidth := rgt - lft + 1 FROM rbx_category WHERE rgt = @toMoveLft - 1; UPDATE rbx_category #1 SET rgt = rgt - @toReplaceWidth WHERE rgt BETWEEN @toMoveLft AND @toMoveRgt AND @toReplaceWidth > 0; UPDATE rbx_category #2 SET rgt = rgt + @toMoveWidth WHERE lft BETWEEN @toReplaceLft AND @toReplaceRgt AND @toReplaceWidth > 0; UPDATE rbx_category #3 SET lft = lft - @toReplaceWidth WHERE rgt BETWEEN @toReplaceLft AND @toReplaceLft + @toMoveWidth AND @toReplaceWidth > 0; UPDATE rbx_category #4 SET lft = lft + @toMoveWidth WHERE rgt BETWEEN ( @toMoveRgt - @toMoveWidth ) AND @toMoveRgt AND @toReplaceWidth > 0; UNLOCK TABLES;
Ale może jest lepszy sposób nić dodawanie wszędzie: AND @toReplaceWidth > 0
