[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с запросом. MySQL
Ramzil_Nixon
Есть 2 записи в одной таблице в виде такого:

name | position


Там 2 записи допустим как уже говорил.

сортировка идет по столбцу position.
Нужно обновить эти 2 строки одним нажатием кнопки. То есть обновить столбец position на этих 2 строках.

Пробовал делать так:

UPDATE `forum-kategory` SET `position` = '2' + '1' WHERE `position` = '2';
UPDATE `forum-kategory` SET `position` = '3' - '1' WHERE `position` = '2' + '1';


Ничего не получается. Может есть другой более просто способ, чем обращение в БД 2 раза?

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
Kusss
Добавьте в вашу таблицу "id int(1) Индекс(PRIMARY) AUTO_INCREMENT".
Оно вам очень пригодиться. И можно будет использовать CASE WHEN

Чтобы прибавить к числу нужно так
`position` = `position` + 1
Ramzil_Nixon
Цитата (Kusss @ 3.01.2019 - 18:02)
Индекс(PRIMARY) AUTO_INCREMENT"


Оно у меня есть.

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

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


Вот и парюсь с этим.

Цитата (Kusss @ 3.01.2019 - 18:02)
И можно будет использовать CASE WHEN


Про это можно подробнее?


_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
Ramzil_Nixon
Цитата (Kusss @ 3.01.2019 - 18:02)
Чтобы прибавить к числу нужно так
`position` = `position` + 1


Вместо position у меня $_GET['down']

$_GET['down']; - из текущей строки на котором была нажата ссылка "вниз".

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
Kusss
тут 2 выхода:
1. Оставить сортировку в том виде как это сейчас. И посчитать математически где прибавить, где отнять

2. Сделать это более красиво и функционально.
Использовать плагин сортировки
И написать несколько строк на js/jquery.
https://jsfiddle.net/eqj6t5p4/
Ramzil_Nixon
Kusss, Да я математический и думаю. Думал в самом коде я чо то не то пишу. Пробовал на pma писать запрос на sql форме - та же шляпа. Одна строка обновляется, а другой запрос как будто бы и нет.

Цитата (Ramzil_Nixon @ 3.01.2019 - 17:53)
робовал делать так:

UPDATE `forum-kategory` SET `position` = '2' + '1' WHERE `position` = '2';
UPDATE `forum-kategory` SET `position` = '3' - '1' WHERE `position` = '2' + '1';



Это как раз и есть запрос на pma.

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
sergeiss
Ramzil_Nixon, значит смотри... После выполнения первого запроса у тебя в БД получается 2строки с position =3. Поэтому тебе надо, на самом деле, сделать три запроса. Первым установить position, равный, например, -1, для первой строки. Вторым запросом сменить position у второй строки. И заием установить position у первой строки.
Более правильно будет написать процедуру в БД, которая сделает это легко и быстро. Всяко быстрее, чем твои отдельные три запроса.
Передаешь в процедуру только номера position, строки с которыми надо поменять местами.
А привязку в условии лучше бы, все-таки, делать по айдишнику, а не по position.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Ramzil_Nixon
Цитата (sergeiss @ 4.01.2019 - 09:47)
Более правильно будет написать процедуру в БД, которая сделает это легко и быстро.


Вот это и не могу понять как сделать.

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
killer8080
Ramzil_Nixon наверно такое нужно?

PHP
$position = 2;

SQL
UPDATE `forum-kategory` 
SET `position` = IF (`position` = $position, `position` + 1, `position` - 1)
WHERE `position` IN ( $position, $position + 1);
Ramzil_Nixon
Цитата (killer8080 @ 4.01.2019 - 13:31)
Ramzil_Nixon наверно такое нужно?


Вроде похоже на то что нужно, щас исправлю, протестирую.

Проверил, все работает. Спасибо.

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

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
killer8080
Цитата (Ramzil_Nixon @ 5.01.2019 - 10:39)
Проверил, все работает. Спасибо.

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

Вторая проблема решается установкой UNIQUE, но тогда этот запрос работать не будет. Вообще пытаться решить эту задачу одним запросом не правильно. Прежде чем апдейтить нужно вначале определить, наличие второй записи, с которой она будет меняться местами, получить их id для для условия апдейта, затем обновление в 3 запроса, как Сергей предлагал, либо в 2 запроса первый из которых засвапит позиции с отрицательным значением чтоб избежать duplicate error, вторым вернуть знаки на место.

https://stackoverflow.com/questions/1120757...ique-constraint
Ramzil_Nixon
killer8080, Ну я протестирую. Если что пойдет не так, попробую исправить и отпишусь здесь если что.

Еще один вопрос есть:

ORDER BY `1 столб`, `2 столб` DESC


таким образом я могу сортировать? Или не стоит? Такую выборку сделал, вроде работает.

_____________
Миллионы приходят, уходят, не в них счастье. Самым важным на свете всегда будут люди в этой комнате, вот здесь, сейчас...

user posted image
Kusss
Ramzil_Nixon
http://phpforum.su/index.php?showtopic=881...0&#entry3093859 - это ?
killer8080
Цитата (Ramzil_Nixon @ 5.01.2019 - 19:31)
killer8080, Ну я протестирую. Если что пойдет не так, попробую исправить и отпишусь здесь если что.

ну я уже сказал, что пойдёт не так. После удаления записей появятся дыры в нумерации, с ними конретно этот запрос нормально работать не будет, так же могут образоваться дубли position, которые сломают всю логику сортировки.
Цитата (killer8080 @ 5.01.2019 - 18:21)
Вторая проблема решается установкой UNIQUE, но тогда этот запрос работать не будет.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.