#php #mysql #sql #linked-list
#php #mysql #sql #связанный список
Вопрос:
Моя таблица выглядит так:
------------------------
| id | title | position |
------------------------
| 1 | test 2 | 3 |
------------------------
| 2 | test 3 | 1 |
------------------------
| 3 | test 1 | 0 |
------------------------
Я нашел этот запрос, который извлекает строки, упорядоченные на основе поля позиции, в котором содержится идентификатор предшественника.
SELECT
*
FROM
mytable AS t1
LEFT JOIN
mytable AS t2
ON t2.position = t1.id
Интересно, почему это работает, потому что нет предложения order by, и база данных не должна знать, что позиция 0 — это строка, с которой нужно начинать.
Комментарии:
1. «почему это работает?» — Теперь есть поворот. Люди в основном приходят сюда с вопросом о полной противоположности.
2. Порядок возврата строк НЕ гарантируется, если в запросе нет
ORDER BY
предложения. MySQL может возвращать строки в любом порядке, который он выбирает. Повторяющееся поведение, которое вы наблюдаете, связано с планом выполнения запроса, который использует MySQL; если MySQL использует индекс, строки могут быть возвращены в той последовательности, в которой они отображаются в индексе. Если MySQL выполняет сканирование таблицы, строки могут быть возвращены в том порядке, в котором они отображаются в таблице.
Ответ №1:
Результат зависит от порядка, в котором вы вставили строки в таблицу. Если, например, вы вставили строку с id = 3 до того, как вставили строку с id = 2, то вы получили бы не отсортированный результат.
В нынешнем виде вы извлекаете данные из t1 в порядке id
, потому что именно в таком порядке вы помещаете элементы в таблицу
Смотрите http://sqlfiddle.com /#!2/63a925/2 и попробуйте сами.
Примечание. Базы данных не гарантированно будут работать так, как вы заявляете, просто большинство баз данных работают именно так. Вы не должны полагаться на это поведение, так как незначительное изменение схемы или запроса может испортить вам весь день! Обратите также внимание, что if id
является (первичным?) ключ, порядок вставки, вероятно, будет переопределен тем фактом, что база данных будет извлекать строки в порядке индекса.
Комментарии:
1. 1. Последовательность, в которой возвращаются строки, определенно НЕ гарантируется, без
ORDER BY
предложения. При отсутствииORDER BY
предложения в запросе база данных может возвращать строки в любом порядке.2. @spencer7593 Спасибо — я также расширил свой ответ, включив ключи, которые также могут изменить порядок…
Ответ №2:
Этот запрос присоединяется к таблице 2 на основе идентификатора в таблице 1, равного позиции в таблице 2. Поскольку идентификаторы в таблице 1 являются последовательными, вывод, по-видимому, отсортирован