Понимаю. секундочку.

Таблица:contentЭти запросы я буду выполнять:

ContentID | CategoryID | Position | Other1 | Other2
===================================================
1         | 1          | NULL     | abcd   | efgh
2         | 1          | NULL     | abcd   | efgh
3         | 1          | NULL     | abcd   | efgh
4         | 2          | NULL     | abcd   | efgh
5         | 2          | NULL     | abcd   | efgh
6         | 2          | NULL     | abcd   | efgh

Теперь я хочу реализовать функцию «вверх», «вниз», «вверх» и «вниз» для содержимого. Все, что мне нужно сделать, это заполнить столбец Position числами:

SELECT ContentID FROM content WHERE CategoryID = 1 ORDER BY Position
SELECT ContentID FROM content WHERE CategoryID = 2 ORDER BY Position

Можно ли добиться этого с помощью одного запроса в MySQL? Что-то вроде:

ContentID | CategoryID | Position
=================================
1         | 1          | 1
2         | 1          | 2
3         | 1          | 3
4         | 2          | 1
5         | 2          | 2
6         | 2          | 3

вы, вероятно, могли бы как-то использовать оператор CASE, но два запроса могут быть лучше.

UPDATE content
SET Position = <ROW_NUMBER>
WHERE CategoryID = 1
ORDER BY Position

UPDATE content
SET Position = <ROW_NUMBER>
WHERE CategoryID = 2
ORDER BY Position
 Your Common Sense09 янв. 2011 г., 15:13
Это должно работать
 Your Common Sense08 янв. 2011 г., 13:42
update content set position = id
 Salman A08 янв. 2011 г., 13:19
@Col. Осколок: будет работать, когда столбец «Позиция» пуст, но не после того, как пользователь установит некоторые элементы.
 dqhendricks08 янв. 2011 г., 07:30
@ Все: Мне только что удалось это сделать.
 Salman A09 янв. 2011 г., 15:09
Ни какого другого предложенного решения. это только для начального заполнения. Чтобы переместить его вверх и вниз, вам нужно будет выполнить другие запросы, простые.

Ответы на вопрос(4)

Решение Вопроса

чтобы сбросить пользовательскую переменную

update 
content,
(
  select 
  @row_number:=ifnull(@row_number, 0)+1 as new_position,
  ContentID 
  from content
  where CategoryID=1
  order by position
) as table_position
set position=table_position.new_position
where table_position.ContentID=content.ContentID;

Добавлено Mchl:

set @row_number:=0;
Вы можете сделать это в одном утверждении, как это

Завтра опробую. Можете ли вы использовать ту же таблицу в обновлении и выбрать?

update 
content,
(
  select 
  @row_number:=ifnull(@row_number, 0)+1 as new_position,
  ContentID 
  from content
  where CategoryID=1
  order by position
) as table_position,
(
  select @row_number:=0
) as rowNumberInit
set position=table_position.new_position
where table_position.ContentID=content.ContentID;
 Salman A09 янв. 2011 г., 15:21
Зависит. Если вы используете пример выше, все в порядке
 ajreal09 янв. 2011 г., 15:23
Работает!!!!!!!!!!!
 Salman A10 янв. 2011 г., 07:48
МЧЛ, мне пришлось поменять () rowNumberInit выше () table_position для этого одного запроса для работы. Как и выше, new_position всегда получается равным 1, если сначала ставится () rowNumberInit, прежде чем @row_number используется в () table_position, new_position дает числа в порядке.
 Peter Barton09 февр. 2016 г., 12:22
Вот решение, которое сработало для меня (надеюсь, оно кому-нибудь поможет):

спусковой крючок a  это срабатывает каждый раз, когда вы хотите вставить / обновить что-то в таблице.В вашем случае

 а такжеBEFORE UPDATE триггер был бы желателен. Если вы также хотите сохранить его чистым после удаления etntry, добавьтеBEFORE INSERT спусковой крючок.AFTER DELETEНачальное:

Перед вставкой:

UPDATE content as uc 
SET Position = (
    SELECT count(*) 
    FROM content as sc 
    WHERE sc.CategoryId = uc.CategoryId AND sc.Position is not null)
WHERE uc.Position is null
ORDER BY uc.ContentId

Дает мне эту ошибку

UPDATE content
SET Position = Position+1
WHERE Position >= newPos AND CategoryId = newCat
 Salman A08 янв. 2011 г., 08:06
Понимаю. секундочку.SQL Error (1093): You can't specify target table 'uc' for update in FROM clause.
 please delete me08 янв. 2011 г., 08:13
Обновление столбца, чтобы он содержал позицию с

что было бы очень утомительно запускать дополнительные запросы все время, когда вы выполняете некоторые операции над таблицей. я мог бы

-- The following query re-populates the "Position" column with sequential numbers so that:
-- a) sequence is reset to 1 for each "group"
-- b) sequence is based on row number relative to each group depending on how ORDER BY is specified
-- c) sequence does not disturb the original order but
-- c.a) fixes NULLs so that they are moved to top
-- c.b) fixes duplicate position values depending on how ORDER BY is specified

-- ContentID is the primary key
-- CategoryID is a foreign key
-- Position column contains relative position of a record

SET @current_group = NULL;
SET @current_count = NULL;

UPDATE 
content
SET Position = CASE
    WHEN @current_group = CategoryID THEN @current_count := @current_count + 1
    WHEN @current_group := CategoryID THEN @current_count := 1
END
ORDER BY CategoryID, Position -- <Column 3>, <Column 4>, ...

Ваш ответ на вопрос