Usaré un ejemplo para esto.
Digamos que estoy tomando fuentes RSS, revisando sus elementos y almacenando información sobre cada elemento en una base de datos. Estoy usando SimplePie para procesar las fuentes y el envoltorio MySQLi de Josh Campbell para las acciones de la base de datos.
Para cada entrada, guardaré el título del elemento, la hora en que se publicó el elemento (recuperado de la fuente), la hora en que se agregó el elemento a mi base de datos (definido en el momento de la inserción en la base de datos) y una ID de incremento automático asignado a cada uno.
function process_rss($rss_url) { require_once './feed-parser/vendor/autoload.php'; $feed = new SimplePie(); // some feed processing logic here $items = $feed->get_items(); $data = array(); foreach ($items as $item) { $data[] = array( 'name' => $item->get_title(), 'published' => $item->get_date(), 'created' => time() ); } $insert = ... // db insert query with the $data array if ($insert) { return 'Imported'; } else { return 'Try again...'; } }Ahora supongamos que ejecuté esta función 3 veces con 3 fuentes diferentes, y se procesó e insertó un total de 7 elementos en la base de datos. Se insertan en el orden en que se procesaron, por lo que mi tabla quedaría de la siguiente manera:
ID | Name | Published | Created ---------------------------------------- 1 | Track 1 | 1595147815 | 1594986945 2 | Track 2 | 1594996785 | 1594986945 3 | Track 3 | 1595146567 | 1594986945 4 | Track 4 | 1594996598 | 1594986945 5 | Track 5 | 1594996096 | 1594986945 6 | Track 6 | 1594986545 | 1594986945 7 | Track 7 | 1594986609 | 1594986945 Lo que quiero hacer ahora es ordenar esa tabla por la columna published de forma permanente (en lugar de ordenar mientras obtengo las entradas de la base de datos).
Tomando el ejemplo anterior, la salida deseada se vería así:
ID | Name | Published | Created ---------------------------------------- 6 | Track 6 | 1594986545 | 1594986945 7 | Track 7 | 1594986609 | 1594986945 5 | Track 5 | 1594996096 | 1594986945 4 | Track 4 | 1594996598 | 1594986945 2 | Track 2 | 1594996785 | 1594986945 3 | Track 3 | 1595146567 | 1594986945 1 | Track 1 | 1595147815 | 1594986945 Al examinar las respuestasproporcionadas aquí , se indica que el uso de ALTER y ORDER BY no mantendrá los cambios en las nuevas inserciones. ¿Cómo haría para lograr esto?
¿Cómo se pueden reordenar los registros de MySQL por una determinada columna de forma permanente?
No puedes hacer eso™. En serio. Y te arrepentirás si lo intentas.
En serio, las filas en las bases de datos SQL no tienen un orden inherente. Si no especifica ORDER BY en su consulta, el servidor puede devolver el conjunto de filas que solicitó en el orden que desee. Si los obtiene en un orden particular que de alguna manera coincide con sus expectativas, es una coincidencia afortunada.
A medida que crecen las tablas, las bases de datos SQL a veces comienzan a utilizar diferentes formas de acceder a ellas. Y, sin ninguna especificación ORDER BY, esas diferentes formas de acceder a ellos pueden generar diferentes ordenaciones. Por lo tanto, si necesita un pedido en particular pero no lo especifica, en algún momento de la vida de su aplicación, el orden cambiará. Cuando no te lo esperas. Y sus usuarios de repente quedarán desconcertados por resultados extraños.
Utilice ORDER BY .