Как отсортировать по алфавиту и сохранить по ID?

Ссылка скопирована
1 ответ

Доброго времени суток. У меня есть база MySQL, использую PhpMyAdmin.
Есть такая структура:
id, name, price
КомандойSELECT * FROM `product` ORDER BY name
Я сортирую всё по алфавиту, а как мне поменять id согласно такой сортировке?
То есть у меня получается в результате запроса:
5, Автомобиль, 1.600.000
8, Квартира, 22.455.000
2, Отель, 1.500.000.000
19, Яхта, 324.666.000
Но мне нужно сделать их ID 1,2,3,4, согласно алфавиту. Подскажите как отсортировать и сразу поменять им ID по порядку ? Спасибо.

Дополнительно:

$sql = "SELECT * FROM `product` ORDER BY name"; $data = $mysqli->query($sql)->fetch_all(MYSQLI_ASSOC); foreach ($data as $i => $row) {     echo ($i+1), $row['name'], $row['price']; }

$sql = "SELECT * FROM `product` ORDER BY name"; $data = $mysqli->query($sql)->fetch_all(MYSQLI_ASSOC); foreach ($data as $i => $row) { echo ($i+1), $row['name'], $row['price']; }

можешь не благодарить

Ответы:

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

SELECT row_number() over (), product.* FROM product ORDER BY name

SELECT row_number() over (), product.* FROM product ORDER BY name

(подправил запрос, спасибо Akina)

  • Только наоборот, сначала звезда, а потом остальные поля. Иначе MySQL выдаст ошибку синтаксиса.
  • Akina, от жеж подлец какой. Надо тестировать запросы, перед тем как писать ответ...
  • galaxy, ну это из той же бочки, что и обязательный пробел после двух тире, иначе не комментарий.

Никак, потому что индекс автоинкрементный и его значения изменять нельзя. Нужно добавить ещё одно поле, в котором уже хранить порядковый номер для ваших целей. Или просто подставлять номер индекса элемента в массиве + 1, как предлагает выше FanatPHP.

  • Нет никаких технических ограничений по изменению id или индекса в Mysql, только философско-идеологические.
    Естественно эти ограничения могут появиться, если на этот индекс будут ссылаться другие таблицы. Но и на этот случай есть ON UPDATE CASCADE
  • Stalker_RED, хотя да, если использовать свободный id для промежуточной замены. Но такое себе решение, лучше все же отельное поле для сортировки иметь.
  • Сергей, это чушь собачья, особенно про "свободный id".
    не над вестись на троллинг, дядя решил повыпендриваться и показать всем, какой он неортодокасльно мыслящий молодец. а на конкретную проблему ему насрать
    уникальный идентификатор может использоваться и вне рамок БД, и это торопливо добавленное ON UPDATE CASCADE превращается в тыкву.
  • FanatPHP, так никто не спорит что такое никому не придёт в голову в здравом уме делать, да и не в здравом уме тоже.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Для того чтобы отсортировать данные по алфавиту и сохранить порядок согласно ID, можно воспользоваться функцией usort() в PHP.

Прежде всего, у вас должен быть массив данных, который вы хотите отсортировать. Предположим, у вас есть массив $data, в котором каждый элемент является ассоциативным массивом с ключами 'id' и 'name'.

Далее, вы можете использовать функцию usort() для сортировки массива по заданным критериям. В данном случае, мы будем сначала сортировать по алфавиту по ключу 'name', а затем сохранять порядок согласно ID.

Пример кода:

usort($data, function($a, $b) {
    if ($a['name'] == $b['name']) {
        return $a['id'] - $b['id'];
    }
    return strcmp($a['name'], $b['name']);
});

usort($data, function($a, $b) { if ($a['name'] == $b['name']) { return $a['id'] - $b['id']; } return strcmp($a['name'], $b['name']); });

Этот код сначала сравнивает элементы по ключу 'name', и если они равны, то сравнивает по ключу 'id'. Функция strcmp() используется для сравнения строк в PHP.

После выполнения этого кода, массив $data будет отсортирован сначала по алфавиту по ключу 'name', а затем сохранит порядок согласно ID.

Надеюсь, это поможет вам решить вашу проблему! Если у вас есть дополнительные вопросы, не стесняйтесь задавать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно