2012-03-02 2 views
2

У меня есть таблица в MySQL, к которой я обращаюсь с PHP. Например, давайте таблица с именем ВЕЩИ:Полностью произвольный порядок сортировки в MySQL с PHP

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

things.name - VARCHAR

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

Мой оператор выбора, чтобы получить то, что мне нужно будет выглядеть:

SELECT * FR OM вещи WHERE owner_ID = 99;

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

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

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

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

ответ

2

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

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

+0

Как это иначе, чем просто включить новый столбец в таблицу вещей для реализации заказа? – Steve

+2

Я понял, что у вас несколько пользователей, и у каждого пользователя может быть другой порядок. Поэтому для каждого пользователя потребуется новый столбец. Чтобы преодолеть эту проблему, используйте вторую таблицу, которая связывает 'user'-' ind indifierifier '-item' вместе (как объяснил Альдо). – apfelbox

+0

Пользователь и элемент уже связаны в исходной таблице. Если я выполняю выбор в таблице с «where user = id order by order_column». Возможно, я должен был упомянуть, что каждый элемент принадлежит только одному пользователю, и этот пользователь может заказывать только свои предметы. – Steve

0

Простейшим выражением упорядоченного списка является: 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 пункте, есть достаточно немногих результатов, чтобы сделать это быстро.

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

Смежные вопросы