Сократить sql запросы - PullRequest
       1

Сократить sql запросы

4 голосов
/ 12 января 2012

Я делаю 3 запроса, чтобы изменить порядок строк в моей таблице

SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;

, который я выполняю сверху вниз.

Вопрос: Есть ли более короткий способ сделать это?


спасибо за все отзывы. но теперь у меня есть другой идеал: Каким-то образом мне нужно «соединить» «kategorieID» с колонкой «id (первичный ключ)» Поэтому мне нужно хранить обе информации в столбце «ранг» в формате:

Сххй

c = номер категории (от 0 до 4) xxx = id (от 1 до ... n) .. уникальный!

пример: вывод:

   rank
 +------+
 + 1001 +
 + 1002 +
 + 1003 +
 + ...  +
 + 1018 +
 + ...  +
 + 2001 +
 + 2002 +
 + 1019 +
 + 1020 +

пока я делал это так:

UPDATE imagedata SET imagedata.rank = (SELECT CONCAT(kategorieID,"",LPAD(id,3,'0')) ) WHERE id=88;

как только этот «ранг» заполняется данными, это дает мне возможность поменять 2 идентификатора.

Поэтому я должен: 1) получить "ранговый" столбец id_1 и id_2 2) получить подстроку ('xxx') этой строки, например: ("004" .. "012") 3) обмениваться подстроками id_1 "rank" и id_2 "rank"

SELECT @ix1:=SUBSTRING(rank, -3) FROM imagedata WHERE id=88;
SELECT @ix2:=SUBSTRING(rank, -3) FROM imagedata WHERE id=83;

.. Я знаю, как его получить, но не знаю, как его обменять?

1 Ответ

1 голос
/ 12 января 2012

Я бы изменил второй запрос, чтобы обновлять только строки, которые НЕ будут обновляться в третьем, например:

SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;

РЕДАКТИРОВАТЬ: За комментарий Ламака, если1006 * может быть NULL, вместо этого вы захотите сделать это:

SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1 OR imagedata.kategorieID IS NULL;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;

Кроме того, возможно, что это решение будет медленнее, чем у вас, особенно если на * 1011 нет индекса,Я говорю это потому, что, хотя вы обновляете меньше строк, теперь он должен сначала отфильтровать этот WHERE.Возможно, вам следует сначала проверить производительность этой программы, чтобы проверить, действительно ли она быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...