MySQL - Ayuda con MySQL

   
Vista:

Ayuda con MySQL

Publicado por Rafa Sanchez (2 intervenciones) el 09/07/2015 17:06:06
Buenas tardes,

Llevo días dándole vueltas a un tema y no se como solucionarlo, espero que aquí me podáis ayudar.

El tema es que, estoy haciendo una página web con panel de control y base de datos para añadir productos, en la tabla de productos hay un campo entero para poder ordenar los productos como mejor me venga pero la duda es la siguiente:

Si yo tengo 5 productos, con orden 1, 2, 3, 4, 5, por ejemplo y quisiera tener la opción de poder añadir un 6 producto pero en la posición 4, y que los otros productos que sumen una posición relativamente, que el 4 pase a ser 5 y el 5 pase a ser 6. Del mismo modo que si elimino un producto, los demás que van detrás resten 1 al orden que tienen.

Sería posible eso?

Saludos y gracias,
Rafa
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con MySQL

Publicado por leonardo_josue (81 intervenciones) el 09/07/2015 20:31:18
Hola Rafa Sanchez:

El orden en que se muestran los registro si no colocas una cláusula ORDER BY es el orden en que se insertaron... para hacer lo que quieres, tendrías que tener un campo exclusivo para el ORDEN, que sea independiente de tu llave,

Puedes hacerlo, pero por partes, es decir, primero tendrías que hacer un UPDATE y después el INSERT respectivo, esto lo puedes hacer por ejemplo en un Procedimiento almacenado, o en un TRIGGER... observa este ejemplo:

Supongamos que tienes esta tabla;

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla;
+------+-------------+-------+
| id   | descripcion | orden |
+------+-------------+-------+
|    1 | uno         |     1 |
|    2 | dos         |     2 |
|    3 | cuatro      |     3 |
|    4 | cinco       |     4 |
+------+-------------+-------+
4 rows in set (0.00 sec)

Si quisieras insertar el registro TRES en la posición 3, primero tienes que cambiar el campo ORDEN para "hacer espacio", tal como lo comentas podrías hacerlo incrementando en 1 el orden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> UPDATE tabla SET orden = orden + 1 WHERE orden >= 3;
Query OK, 2 rows affected (0.10 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql> SELECT * FROM tabla;
+------+-------------+-------+
| id   | descripcion | orden |
+------+-------------+-------+
|    1 | uno         |     1 |
|    2 | dos         |     2 |
|    3 | cuatro      |     4 |
|    4 | cinco       |     5 |
+------+-------------+-------+
4 rows in set (0.00 sec)

De esta manera ahora puedes insertar el nuevo registro sin problemas:

1
2
mysql> INSERT INTO tabla values (5, 'tres', 3);
Query OK, 1 row affected (0.08 sec)

Observa que en realidad el registro se inserta al final de la tabla, así funciona la BD's,

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla;
+------+-------------+-------+
| id   | descripcion | orden |
+------+-------------+-------+
|    1 | uno         |     1 |
|    2 | dos         |     2 |
|    3 | cuatro      |     4 |
|    4 | cinco       |     5 |
|    5 | tres        |     3 |
+------+-------------+-------+
5 rows in set (0.00 sec)

Para mostrarlo en el orden en que tú definiste, tendrías que hacer un ORDER BY por el campo que marca la ordenación:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla ORDER BY orden;
+------+-------------+-------+
| id   | descripcion | orden |
+------+-------------+-------+
|    1 | uno         |     1 |
|    2 | dos         |     2 |
|    5 | tres        |     3 |
|    3 | cuatro      |     4 |
|    4 | cinco       |     5 |
+------+-------------+-------+
5 rows in set (0.00 sec)

observa que el ID del registro y en valor del campo ORDEN SON COMPLETAMENTE INDEPENDIENTES... Por ninguna razón es recomendable hacer UPDATES a campos llaves... es por eso que es mejor agregar un campo.


Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con MySQL

Publicado por Rafa Sanchez rspaisano@gmail.com (2 intervenciones) el 10/07/2015 17:56:25
Buenas Leo,

Gracias por tu pronta respuesta, entonces esa consulta la tengo que poner en la misma página dónde tengo el formulario de inserción? Te explico por encima como lo hago:

Yo creo una página para insertar, una para editar y otra para eliminar, para tenerlo todo más ordenado. En la página de insertar tengo esta consulta:

$insertSQL = sprintf("INSERT INTO tbltour (strNombre, strTitulo, intCategoria, strDireccion, strPoblacion, strProvincia, strTelefono, strWeb, strMail, strHorario, strUrlTour, intOrden, strDescripcion, strMini, strMapa, strQR) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
GetSQLValueString($_POST['strNombre'], "text"),
GetSQLValueString($_POST['strTitulo'], "text"),
GetSQLValueString($_POST['intCategoria'], "int"),
GetSQLValueString($_POST['strDireccion'], "text"),
GetSQLValueString($_POST['strPoblacion'], "text"),
GetSQLValueString($_POST['strProvincia'], "text"),
GetSQLValueString($_POST['strTelefono'], "text"),
GetSQLValueString($_POST['strWeb'], "text"),
GetSQLValueString($_POST['strMail'], "text"),
GetSQLValueString($_POST['strHorario'], "text"),
GetSQLValueString($_POST['strUrlTour'], "text"),
GetSQLValueString($_POST['intOrden'], "int"),
GetSQLValueString($_POST['strDescripcion'], "text"),
GetSQLValueString($_POST['strMini'], "text"),
GetSQLValueString($_POST['strMapa'], "text"),
GetSQLValueString($_POST['strQR'], "text"));


Y en la página de editar tengo esta consulta:

$updateSQL = sprintf("UPDATE tbltour SET strNombre=%s, strTitulo=%s, intCategoria=%s, strDireccion=%s, strPoblacion=%s, strProvincia=%s, strTelefono=%s, strWeb=%s, strMail=%s, strHorario=%s, strUrlTour=%s, intOrden=%s, strDescripcion=%s, strMini=%s, strMapa=%s, strQR=%s WHERE idContador=%s",
GetSQLValueString($_POST['strNombre'], "text"),
GetSQLValueString($_POST['strTitulo'], "text"),
GetSQLValueString($_POST['intCategoria'], "int"),
GetSQLValueString($_POST['strDireccion'], "text"),
GetSQLValueString($_POST['strPoblacion'], "text"),
GetSQLValueString($_POST['strProvincia'], "text"),
GetSQLValueString($_POST['strTelefono'], "text"),
GetSQLValueString($_POST['strWeb'], "text"),
GetSQLValueString($_POST['strMail'], "text"),
GetSQLValueString($_POST['strHorario'], "text"),
GetSQLValueString($_POST['strUrlTour'], "text"),
GetSQLValueString($_POST['intOrden'], "int"),
GetSQLValueString($_POST['strDescripcion'], "text"),
GetSQLValueString($_POST['strMini'], "text"),
GetSQLValueString($_POST['strMapa'], "text"),
GetSQLValueString($_POST['strQR'], "text"),
GetSQLValueString($_POST['idContador'], "int"));


La consulta que tu me dices tendría que ponerla en la misma página que tengo de inserción? Cómo sería la consulta? Soy un poco novato en esto, lo siento.

Saludos,
Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar