Полностью произвольный порядок сортировки в MySQL с PHP - PullRequest
2 голосов
/ 02 марта 2012

У меня есть таблица в MySQL, к которой я обращаюсь из PHP.Например, у нас есть таблица с именем THINGS:

things.ID - первичный ключ int

things.name - varchar

things.owner_ID - int для присоединенияс другой таблицей

Мое предложение select для получения того, что мне нужно, может выглядеть следующим образом:

SELECT * ИЗ вещей, ГДЕ owner_ID = 99;

Довольно просто.Теперь я хотел бы, чтобы пользователи могли указывать совершенно произвольный порядок для элементов, возвращаемых из этого запроса.Список будет отображаться, затем они могут нажать кнопку «вверх» или «вниз» рядом со строкой и переместить ее вверх или вниз по списку, или, возможно, выполнить операцию перетаскивания, чтобы переместить его в другое место.Я бы хотел, чтобы этот заказ был сохранен в базе данных (той же или другой таблице).Пользовательский порядок будет уникальным для набора строк для каждого owner_ID.

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

  1. Добавьте столбец INT и установите его значение на все, что мне нужно, чтобы строки возвращались в моем порядке.Это создает проблему сканирования построчно для поиска точки вставки и, возможно, необходимости обновления столбца сортировки предыдущих / следующих строк.
  2. Наличие столбцов «следующий» и «предыдущий», реализующих связанныйсписок.Как только я найду свое место, мне просто нужно обновить максимум 2 строки, чтобы вставить строку.Но это требует сканирования местоположения из строки № 1.
  3. Какой-то трюк с SQL / реляционной БД, о котором я не знаю ...

Я ищу ответ на #3 потому что это может быть там, кто знает.Кроме того, я бы хотел как можно больше разгрузить базу данных.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

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

Эта таблица должна содержать идентификатор пользователя, позицию вещи и идентификатор вещи. (User_id, thing_id) должен быть PK. Таким образом, вам нужно обновлять эту таблицу каждый раз, но вы можете получить вещи для пользователя в том порядке, в котором он / она хочет, используя ORDER BY в таблице user_orderings и соединяя ее с таблицей вещей. Это должно работать.

0 голосов
/ 29 сентября 2017

Самое простое выражение упорядоченного списка: 3,1,2,4.Мы можем сохранить это как строку в родительской таблице;поэтому, если наша таблица photos с внешним ключом profile_id, мы разместим наш заказ фотографий в profiles.photo_order.Затем мы можем рассмотреть это поле в нашем предложении order by, используя функцию find_in_set().Это требует либо двух запросов, либо объединения.Я использую два запроса, но объединение более интересно, поэтому вот оно:

select photos.photo_id, photos.caption
from photos
    join profiles on profiles.profile_id = photos.profile_id
where photos.profile_id = 1
order by find_in_set(photos.photo_id, profiles.photo_order);

Обратите внимание, что вы, вероятно, не захотите использовать find_in_set() в предложении where из-за влияния на производительность, но вВ предложении order by имеется достаточно мало результатов, чтобы сделать это быстро.

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

...