2011-12-24 3 views
2

У меня есть база данных, в которой есть таблица со значениями «ID», которые сильно меняются. Это может быть как: Создайте новую таблицу с строками в порядке возрастания


row1.ID = 5, row2.ID = 47, row3.ID = -6, т.д.
Полностью случайный порядок. Могу ли я создать другую таблицу при загрузке страницы, на которой будут взяты все строки в первой таблице и создать вторую таблицу, упорядочивающую их по порядку значения «ID». Так вторая таблица будет:
row1.ID = -6, row2.ID = 5, row3.ID = 47, и т.д.
Имеет ли это смысл?

+0

Вам нужны две разные базы данных или две разные таблицы? – SlavaNov

+0

Извините, две разные таблицы. Я пойду отредактирую это. –

+1

Ответил, посмотрите это - http://en.wikipedia.org/wiki/Order_by – SlavaNov

ответ

1

Конечно, самый простой ответ - использовать ORDER BY при запросе вашей таблицы, а затем вы можете контролировать порядок строк в наборе результатов запроса. Но я предполагаю, что вы хотите, чтобы «естественный» порядок строк был в числовом порядке, когда вы не используете ORDER BY.

Если ваша таблица использует механизм хранения InnoDB, порядок по умолчанию при запросе без использования ORDER BY всегда является порядком первичного ключа. Это потому, что InnoDB хранит таблицы как кластерный индекс по первичному ключу. Поэтому, если ID является вашим основным ключом, и вы конвертируете свою таблицу в InnoDB, тогда вы можете положиться на ее естественный порядок.

mysql> ALTER TABLE MyTable ENGINE=InnoDB; 

Если таблица хранится в MyISAM, естественный порядок строк порядка физические хранятся в файле данных, который не имеет ничего общего с порядком значений или даже порядок, в котором вы создали строк.

Для этих таблиц можно сбросить таблицу в порядке первичного ключа с:

$ mysqldump --order-by-primary databasename tablename > table.sql 

Затем восстановить таблицу. Данные будут перезагружены в порядке первичного ключа. Затем в дальнейшем заказ по умолчанию при запросе без использования ORDER BY будет по ID.Но это не мешает рядам снова выходить из строя при изменении значений.


Re ваши комментарии:

Наилучшим вариантом было бы использовать WHERE. Это эффективно, потому что он может использовать кластерный индекс, чтобы быстро найти правильную строку.

SELECT * FROM MyTable WHERE ID = 6; 

В качестве альтернативы, которая является менее эффективным, но все же лучше, чем возвращение всех строк, чтобы выбрать некоторую строку или строки по их положению в потоке, а не по их стоимости.

SELECT * FROM MyTable LIMIT 1 OFFSET 5; 

Первое число - сколько строк вы хотите, второе число - это количество строк, которые нужно пропустить первым.

Обычно вы должны использовать LIMIT только после указания заказа, иначе вы могли бы получить строки в каком-то бессмысленном порядке, а пятая строка не была бы более желательной, чем первая строка.

SELECT * FROM MyTable ORDER BY created_at LIMIT 1 OFFSET 5; 
+0

О, я не знал, как это упорядочено с помощью первичного ключа! Это хорошо знать (это только мой второй день с mysql). Я не уверен, что если я использую InnoDB, но я думаю, что использование Order By, как вы сказали, будет работать лучше всего для меня ... так что мой вопрос: если я захочу захватить определенное сырье после организации с помощью заказа (нет необходимости создавать новая таблица сейчас), как бы я это сделал? Я предполагаю, что это будет связано с созданием массива, который имеет строки таблицы, упорядоченные моей переменной «ID» ... Но я не знаю, куда идти оттуда /: Спасибо за всю помощь до сих пор! Ждем вашего ответа! –

+0

Например, я бы сделал что-то подобное, чтобы получить 5-ю строку после заказа массива? '$ table1 = mysql_query (" SELECT * FROM table1 ORDER BY id DESC ") или die (mysql_error());' '$ orderedArray = mysql_fetch_array ($ table1 [5]);' '$ row5id = $ orderedArray [ 'id']; ' –

+0

Вы можете использовать предложение LIMIT для выделения определенной строки или строк и пропустить некоторые. Или, если вы хотите выбрать определенную строку на основе ее основного значения ключа, это еще более эффективно. Вы сделали бы это с помощью предложения WHERE. Возможно, было бы полезно получить книгу или учебник по MySQL, если вы собираетесь его использовать. –

0

Просто добавьте ORDER BY ID к вашему выбранному cmd, не создавайте вторую таблицу только для заказа?

+0

Так что, если бы я хотел захватить 10-ю строку после того, как я использовал ORDER BY ID, как бы это сделать? Это только мой второй день с PHP и MySQL /: Медведь со мной :) –

+0

Если вы хотите получить определенную строку, вы никогда не должны полагаться на порядок базы данных, например, выберете ее с WHERE ID = 10'. Вы должны обновить свой вопрос или задать другой вопрос тем, что вы действительно делаете (например, 10-я строка). – Marc

+0

Ну идентификаторы будут случайными числовыми значениями ... Я помещу их в массив, заказывая их в порядке возрастания. Затем, после того, как у меня есть массив, как получить, например, третью строку в этом массиве (строка с 3-м наивысшим значением для «id» в моей исходной таблице) ... Я думал, что сделаю что-то вроде строк это, но я не могу понять: '$ table1 = mysql_query (" SELECT * FROM table1 ORDER BY id DESC ") или die (mysql_error());' $ orderedArray = mysql_fetch_array ($ table1 [3]); '' $ row3id = $ orderedArray ['id']; ' –

0

Вы не можете это сделать, так как даже если вы теоретически * сохранить их в правильном порядке, вы должны использовать ORDER BY оператор, чтобы вернуть его в правильном порядке, в противном случае СУБД может вернуть его в любом порядке

ORDER BY является единственный способ сортировки строк в результирующем наборе. Без этот раздел, система реляционной базы данных может возвращать строки в любом порядке . (От ORDER BY - Википедия)

Так или иначе, вы должны использовать ORDER BY (если это не было ясно из моего ответа - это редактировать)

* теоретический путь:

INSERT INTO table2 SELECT * FROM table1 ORDER BY ID 

table1 и table2 должны иметь одинаковую схему

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