Вот классная вещь: MySQL INSERT . . . SELECT
:
INSERT INTO `featured`
(
`entry_id`, `featured_order`
)
SELECT 200, COUNT(*) + 1
FROM `featured`
Никаких подзапросов не требуется.
@ Богемский имеет хороший момент:
Лучше использовать max (featured_order) + 1, если вы используете этот подход
Так что лучшим запросом, вероятно, будет:
INSERT INTO `featured`
(
`entry_id`, `featured_order`
)
SELECT 200, MAX(`featured_order`) + 1
FROM `featured`
Его триггерметод, описанный в его ответе, также является хорошим способом выполнить то, что вы хотите.
Потенциальная проблема с запросом 1 состоит в том, что если вы когда-нибудь удалите строку, ранг будет отброшен, и вы получитедубликат в featured_order
.Со вторым запросом это не проблема, но у вас будут пробелы, как если бы вы использовали столбец с автоинкрементом.
Если вам абсолютно необходим заказ без пробелов, лучшее из известных мне решенийдля запуска этой серии запросов:
SET @pos:=0;
DROP TABLE IF EXISTS temp1;
CREATE TEMPORARY TABLE temp1 LIKE featured;
ALTER TABLE featured ORDER BY featured_order ASC;
INSERT INTO temp1 (featured_id, entry_id, featured_order)
SELECT featured_id, entry_id, @pos:=@pos+1 FROM words;
UPDATE featured
JOIN temp1 ON featured.featured_id = temp1.featured_id
SET featured.rank = temp1.rank;
DROP TABLE temp1;
Всякий раз, когда вы удаляете строку