Witam, mam sekwencję zamieniającą mi w drzewku dwa poddrzewa miejscami, wykonującą się jako ciąg instrukcji w MySQL.
Chciałbym jednak, by część instrukcji wykonała się warunkowo i nie bardzo mam pomysł jak poprawić moje zapytania
Pierwsza wersjaLOCK 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

?