2009-05-01 42 views
29

¿Es posible reordenar filas en la base de datos SQL? Por ejemplo; ¿Cómo puedo cambiar el orden de los valores de la 2ª fila y 3ª fila?¿Cómo puedo reordenar filas en la base de datos sql?

El orden de la fila es importante para mí ya que necesito mostrar el valor según el orden.


Gracias por todas las respuestas. Pero 'Ordenar por' no funcionará para mí.

Por ejemplo, puse una lista de marcadores en la base de datos. Quiero mostrar en función del resultado que obtengo de la consulta. (no en orden alfabético). Justo cuando están insertados.

Pero el usuario puede volver a organizar la posición del marcador (de cualquier manera que desee). Entonces no puedo usar 'ordenar por'.

Un ejemplo es cómo se muestra el marcador en el marcador en firefox. El usuario puede cambiar de posición fácilmente. ¿Cómo puedo mencionar eso en DB?

Gracias.

Respuesta

10

Use ORDER BY en su consulta SELECT. Por ejemplo, para ordenar por el apellido de un usuario, use:

SELECT * FROM User ORDER BY LastName 
4

El orden de las filas en la base de datos real no debería importar.

Debe utilizar la cláusula ORDER BY en sus consultas para ordenarlas cuando lo necesite.

1

Supongo que un simple order by sería lo que estás buscando?

select my_column from my_table order by my_order_column; 
1

Como otros han dicho usar un pedido de.
Nunca dependa de la información de orden existente en una tabla física, siempre base en los datos con los que está trabajando, ya sea uno o más campos clave.

3

Las bases de datos pueden almacenar los datos de la forma que deseen. El uso de la cláusula "ordenar por" es la forma única para garantizar un orden de los datos. En el ejemplo de marcador, puede tener un campo entero que indique el orden y luego actualice ese campo a medida que el usuario mueve las cosas. Luego ORDENE POR esa columna para poner las cosas en el orden correcto.

15

Como han mencionado otros, no es una buena idea depender del orden físico de la tabla de la base de datos. Las tablas relacionales son conceptualmente más como conjuntos desordenados que listas ordenadas. Asumir un cierto orden físico puede conducir a resultados impredecibles.

Parece que lo que necesita es una columna separada que almacena el orden de clasificación preferido del usuario. Pero aún tendrá que hacer algo en su consulta para mostrar los resultados en ese orden.

Es posible especificar el orden físico de los registros en una base de datos mediante la creación de un índice agrupado, pero eso no es algo que desee hacer en una base de datos arbitrariamente especificada por el usuario. Y aún puede conducir a resultados inesperados.

0

En respuesta a your post here, la respuesta que puede estar buscando es:

Para pedir cronológicamente, agregar una columna DateAdded o similar con un tipo de datos datetime o smalldatetime.

En todos los métodos que se insertan en la base de datos, asegúrese de insertar CURRENT_TIMESTAMP en la columna DateAdded.

En los métodos que consultan la base de datos, agregue ORDER BY DateAdded al final de la cadena de consulta.

NUNCA dependa de la posición física en el sistema de la base de datos. Es puede trabajo la mayoría del tiempo, pero definitivamente no todo el tiempo.

63

Parece que necesita otra columna como "ListOrder". Entonces su tabla podría verse así:

BookMark ListOrder 
======== ========= 
    d  1 
    g  2 
    b  3 
    f  4 
    a  5 

Luego puede "ordenar por" ListOrder.

Select * from MyTable Order By ListOrder 

Si el usuario sólo puede mover un marcador un lugar al mismo tiempo, puede utilizar números enteros como el ListOrder, e intercambiarlos. Por ejemplo, si el usuario quiere mover "f" una fila hacia arriba:

Update MyTable 
    Set ListOrder=ListOrder+1 
     Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f') 

Update MyTable 
    Set ListOrder=ListOrder-1 
     Where BookMark='f' 

Si el usuario puede mover un marcador arriba o hacia abajo muchas filas a la vez, entonces usted necesita para cambiar el orden de un segmento. Por ejemplo, si el usuario quiere mover "f" de la parte superior de la lista, es necesario:

update MyTable 
    Set ListOrder=ListOrder+1 
     where ListOrder>=1 -- The New position 
      and ListOrder <(Select ListOrder from MyTable where BookMark='f') 

update MyTable 
    Set ListOrder=1 -- The New Position 
     Where Bookmark='f' 
+0

Gracias por esta idea. Creo que estaba tratando de ver si puedo resolver mi problema sin crear un nuevo Coloumn. – lucius

+0

¿Pero puede esto funcionar si un marcador se mueve más de 1 lugar a la vez? Por ejemplo, ¿qué pasa si el usuario desea mover "f" de 4 a 2? todo g, b, una necesidad de actualizarse. – lucius

+0

Sí, ese es mi segundo ejemplo en el código anterior. –

0

En primer lugar, permítanme acuerdo con todos los aquí que el orden de la tabla no debe importar. Use una columna separada [SortOrder] que actualice e incluya una cláusula Order By.

Dicho esto, las bases de datos de SQL Server permiten un único "índice agrupado" en una tabla que realmente forzará la posición en el almacenamiento de la tabla subyacente. Principalmente útil si tiene un gran conjunto de datos y siempre consulta por algo específico.

0

La pregunta carece de cualquier detalle que permita que alguien le dé una respuesta correcta. Claramente, puede leer los registros en la memoria y luego actualizarlos. Pero esto es malo en muchos niveles diferentes.

El problema es el siguiente. Dependiendo del esquema que realmente se implemente, existe una lógica en la forma en que los registros se escriben físicamente en el disco. A veces se escriben por orden de inserción y otras veces se insertan con espacio entre bloques (ver extensiones).

Por lo tanto, no es probable cambiar el orden físico sin intercambiar datos de columna; y esto tiene un profundo efecto en los diversos índices. Te queda la necesidad de cambiar el orden lógico.

A medida que leo su actualización ... Tengo que entender que es posible que tenga varios usuarios y que cada usuario tenga marcadores que deseen. Parece que necesita una segunda tabla que actúe como una intersección entre el usuario y el marcador. Entonces todo lo que necesitas es una unión interna y una orden por.

Pero no hay suficiente información para ofrecer una solución completa.

0

Agregue una columna position a su tabla y almacénela como un número entero simple.

Si necesita admitir múltiples usuarios o listas, su mejor opción es crear una tabla de marcadores, una tabla de usuarios y una tabla para vincularlos.

  • marcadores: id,url
  • usuarios: id,name
  • users_bookmarks: user_id, bookmark_id, position, date_created

Suponiendo date_created se llena cuando la inserción de filas puede obtener ordenamiento lista secundaria en base a la fecha.

select bookmark_id from users_bookmarks where user_id = 1 order by position, date_created; 
1

Tengo una solución para esto que he usado algunas veces. Guardo un campo adicional "sort_order" en la tabla, y actualizo esto al reordenar. Lo he usado en casos en los que tengo algún tipo de contenedor con artículos, y el orden de los artículos debe poder editarse dentro del contenedor. Al reordenar, solo actualizo el sort_order para los elementos en el contenedor actual, lo que significa que no se deben actualizar muchas filas (por lo general, en la práctica, solo unas pocas).

En resumen, hago lo siguiente:

  1. agregar un campo sort_order a la tabla de artículos
  2. al insertar una nueva fila, me puse sort_order = id
  3. cuando reordenamiento (necesita id del elemento a moverse, y el ID de elemento a insertar después):
    • SELECT ID, sort_order de artículos donde la orden del envase = ID por sort_order
    • dividir el ID y sort_order de filas en dos array s
    • quitar el identificador del elemento para mover de la id-lista
    • insertar el identificador del elemento para mover después de que el id del elemento a insertar después de
    • fusionar la lista de ID y la lista de sort_order en una matriz de dos dimensiones, como [[id, sort_order], [id2, sort_order], ...]
    • update item set sort_order=SORT_ORDER where id=ID plazo (executemany) con la lista fusionada

(Si se mueve el artículo a otro recipiente, después de actualizar el "envase exterior tecla" mover primero o el último en función de app.)

(Si la actualización implica un gran número de artículos, no creo que esta solución es un buen enfoque.)

me han hecho un ejemplo usando Python y MySQL en http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html (copiar y probarlo) junto con algunas explicaciones adicionales.

-3

Si desea organizar los registros en la tabla según sus necesidades específicas y cuando usted no tiene campo para que los registros de la tabla, puede probar la siguiente opción:

  1. abierto que esquema de base/base de datos utilizando editor de sapos
  2. Exportar la tabla deseada en formato excel con la opción de exportación de sapos
  3. Realice los cambios que desee en Excel exportado. Es bastante simple reordenar filas en Excel.
  4. Guarde Excel e impórtelo de nuevo en la tabla con la opción de importación de sapos.

get sapo: http://www.quest.com/toad-for-mysql/

+0

Esto es inútil para las acciones del usuario y no es una buena idea (ver casi todas las demás respuestas) –

-1

si tiene una columna numérica (fila, ID de transacción, etc.) y esto es lo que está esperando a ser resuelto, por lo que la columna de una clave principal resolverá la clasificación problema sin la necesidad de ejecutar sentencias de actualización o consultar la tabla.

Cuestiones relacionadas