PHP mysql упорядочивание строк - PullRequest
1 голос
/ 16 июня 2011

Например, у меня есть таблица, которая выглядит так:

id | имя

1 | Mike

2 | Адам

3 | John

4 | Сара ...

Теперь, когда я выполню запрос select * from table order by id desc, он выдаст что-то вроде этого:

4 | Сара

3 | John

2 | Адам

1 | Mike

Что мне делать, если я хочу переместить строку Джона вверх или вниз или переместить строку Адама вверх или вниз (с помощью запроса MySQL (мне нужен базовый, просто чтобы узнать, с чего начать)).

Мое решение:

Прежде всего, я создал еще один столбец с именем orderID, который имеет то же значение, что и идентификатор.

Вот пример, который перемещает пользователя вверх:

 $query = "
 SELECT  (
    SELECT orderID 
    FROM test WHERE id = 'user id that i want to move up'
    ) AS user_order,
    (
    SELECT orderID 
    FROM test WHERE orderID > user_order 
    ORDER BY orderID 
    LIMIT 0,1
    ) AS nextUser_order
 ";
 $result = mysql_query($query);
 $data = mysql_fetch_assoc($result);
 $query = "
 UPDATE test SET orderID = IF(orderID='{$data[nextUser_order]}', 
                  '{$data[user_order]}', '{$data[nextUser_order]}')
      WHERE orderID IN ('{$data[nextUser_order]}', '{$data[user_order]}');
 ";
 $result = mysql_query($query);

Есть ли лучший способ сделать это?

Ответы [ 5 ]

2 голосов
/ 16 июня 2011

Вы должны поменять идентификаторы или заказать их по другому столбцу.Это единственный способ.

1 голос
/ 17 июня 2011

Изменение id - это , а не , что вы хотите сделать. Вы никогда не хотите связываться с вашим первичным ключом, особенно потому, что в дальнейшем было бы легче (и занимать гораздо меньше места, один - int, а другой varchar) - ссылаться на своих пользователей, используя их идентификатор, а не имя из других таблиц. , приятно иметь поле, которое, как ты знаешь, никогда не изменится.

Создайте другое поле, например order, как число floating point.

При перемещении foo между bar и foobar установите foo '* order на average из bar и foobar' * order.

0 голосов
/ 16 июня 2011

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

0 голосов
/ 16 июня 2011

Таблицы SQL по своей природе не упорядочены - они фактически ведут себя как «мешок строк».Если вы хотите получить результаты в определенном порядке, вам нужно будет отсортировать их (используя ORDER BY ...), когда вы вытащите их из пакета - в противном случае сервер SQL вернет их в любом порядке, который он считает наиболее простым.(В этом случае они выводятся в обратном порядке, в котором вы их вставили, но это совсем не гарантируется.)

0 голосов
/ 16 июня 2011

Вы можете поместить произвольные значения в предложение order by в запросе, но ни одно из них не будет легко работать для простых вещей типа "двигаться вверх / вниз по строке". Вы можете принудительно сортировать определенные значения первыми или последними, но не «ставьте это значение после этого значения, но позволяйте этому значению войти в свое естественное место». Вам потребуется дополнительное поле для указания порядка сортировки.

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