Archivo de la etiqueta: Tips

100 consejos SEO para poner tu blog en lo mas alto de Google – SEO Tips

Hace años con la explosión de internet se impuso una máxima que era “Si no estas en internet no existes”, hoy en día esa frase sigue vigente pero se completa con esta otra ” y si no apareces en la primera pagina de los buscadores es como si no existieras”. Desde la primera parte de la frase hasta la actual el trabajo a la hora de desarrollar un sitio web ha cambiado, y lo que podía considerarse como una tarea propia del desarrollador se ha convertido en una tarea especifica de un especialista y dedicar mas tiempo que el que mucha gente se cree. El siguiente articulo nos puede ayudar a la hora de posicionar nuestra/as paginas en lo mas alto de internet.
https://exploreb2b.com/articles/100-seo-tips-turn-your-blog-into-the-top-of-google

Enhanced by Zemanta
Anuncios

Borrar un dato de dos tablas con la misma consulta – MySQL Tips

MySQLSeguramente en alguna ocasión nos habremos visto, o nos podemos ver en la situación de borrar de dos tablas un dato, un ejemplo clásico seria el de creo una factura y esta contiene productos, con lo que podríamos tener una tabla de Facturas y otra tabla que fueran detallesFacturas, en la primera guardaríamos los datos generales de la factura y en el la segunda los artículos o lineas que comprondría la factura, pues bien, si borro la factura tengo que borrar también los artículos que estaban en esa factura, y eso tendría que poder hacerlo con una sola consulta.

Tabla Facturas Tabla detallesFacturas
Id Id
 (Resto campos) IdFactura
IdProducto
(Resto campos)

Imaginemos que tenemos la factura 123 y tenemos que borrarla y queremos borrar también todos los registros referentes a esa factura en la tabla detallesFactura.

La consulta de borrado quedaría así

DELETE a1, a2 FROM Facturas AS a1 INNER JOIN detallesFacturas AS a2
WHERE a1.Id=a2.IdFactura AND a1.Id LIKE 123;

Otra opción podria ser

DELETE FROM a1, a2 USING Facturas AS a1 INNER JOIN detallesFacturas AS a2
WHERE a1.Id=a2.IdFactura AND a1.Id LIKE 123;

Y con esta consulta borraríamos la factura de la tabla Facturas y los datos de la factura que hubiera en la tabla de detallesFacturas.

Mas info aqui: http://dev.mysql.com/doc/refman/5.1/en/delete.html

Libreria para formatear numeros con Javascript

Una librería de JavaScript muy útil para dar formato a los números a la hora de presentarlos en el formato que queramos, la posición de las comas y los puntos, el símbolo de la moneda, valores negativos.

Formatting numbers in JavaScript – mredkj.com.

Datepicker Jquery en castellano

Dejo el codigo del datepicker de Jquery para que salga en formato castellano

He creado otro Gist con una demo de como crearlo sin necesidad de hacer clic en el input

La documentación de jQuery UI http://jqueryui.com/demos/datepicker/

Subquery Vs. Join – MySQL Tips

Tengo una aplicación web en la cual muestro los datos de las facturas de clientes, junto con el nombre de cliente. Desde un principio observe que la consulta un poco mas de lo normal, asi que me puse a investigar.

Propiedades de las tablas:

La tabla clientes tiene los tipicos campos, los que nos interesan son Id y Nombre, y luego el Id es PrimaryKey, NotNull, AutoIncrement, y tiene 732 registros

La otra tabla es regfacturas, en la cual se registran los datos importantes de las facturas, los campos que nos interesan son el id y el idCliente, el id es PrimaryKey, NotNull, AutoIncrement y el idCliente no esta definido como ForeingKey, luego probaremos a definirlo a ver que resultados nos salen. Esta tabla tiene 4950 registros.

Las dos tablas son InnoDB y como collation utf8, la version del servidor es 5.1.58 y voy a efectuar las consultas en la consola de MySQL.

Nota: Para que los resultados sean efectivos es recomendable efectuar un vaciado de la cache de consultas:


flush query cache;

La consulta original es:


Select r.id as id,r.codigo as codigo,r.fecha as fecha,r.importe as importe ,r.obs_alt as obs_alt,
 c.Nombre as nombre from regfacturas as r join clientes as c on r.id_cliente like c.id order by r.fecha desc

Los resultados de esta consulta fueron: 4945 rows in set (1.71 sec)

Visto estos tiempos, me plantee modificar la consulta y hacerla con subquery

La consulta con subquery es:


Select id, codigo, id_cliente as idCliente,
date_format(fecha,'%d-%m-%Y') as fecha,
importe, obs_alt as observaciones,
(Select Nombre from clientes where id = id_cliente) as cliente
FROM regfacturas order by fecha desc

Los resultados de esta consulta fueron: 4950 rows in set (0.16 sec)

Vistos estos resultados uno dice menuda diferencia entre la subquery y el join, entonces para que usar join, a partir de ahora todo a subquerys. Antes de lanzarnos como locos vamos a afinar un poco mas.

Vamos a probar ahora la consulta con join pero sin la ordenacion de fechas a ver si es eso lo que hace que funcione lenta


Select r.id as id,r.codigo as codigo,r.fecha as fecha,r.importe as importe ,r.obs_alt as obs_alt,
 c.Nombre as nombre from regfacturas as r join clientes as c on r.id_cliente like c.id

Los resultados de esta consulta fueron: 4945 rows in set (1.68 sec)

Parece que sin la ordenacion de fecha ganamos algo de velocidad, aunque el tiempo de respuesta sigue siendo inaceptable

Probemos ahora con la subquery


Select id, codigo, id_cliente as idCliente,
date_format(fecha,'%d-%m-%Y') as fecha,
importe, obs_alt as observaciones,
(Select Nombre from clientes where id = id_cliente) as cliente
FROM regfacturas

Los resultados de esta consulta fueron:  4950 rows in set (0.12 sec)

Con estos resultados vemos que la ordenación tanto en una como en otra tabla tiene un coste de entre 0.03 – 0.04 , y que con esta estructura de tabla es muchisimo mas rapido el uso de subquery que de inner joins

Agregando una ForeingKey

Al ir a agregar una ForeingKey al id_cliente me dio el siguiente error

ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

Googleando descubri que no se podia agregar por que habia registros en la tabla en la cual queria crear la clave foranea que no estaban en la otra tabla.

Para descubir cuales eran estos registro hize la siguiente consulta:


SELECT COUNT( * ) AS cuenta
FROM regfacturas t1
LEFT JOIN clientes t2 ON t1.id_cliente = t2.id
WHERE t2.id IS NULL

El resultado de esta consulta nos dio 5, lo que nos quiere indicar que tenemos 5 campos que estan mal
A continuacion haciendo la siguiente consulta

SELECT * FROM regfacturas t1 LEFT JOIN clientes t2 ON t1.id_cliente = t2.id WHERE t2.id IS NULL

Salieron los campos que nos daban problemas, los borramos, y ya se pudo establecer la FK.
Ahora que ya la tenemos definida vamos a repetir las consultas a ver que sale
La consulta con inner Join dio el siguiente resultado: 4945 rows in set (1.80 sec)
Y la consulta con subquery: 4945 rows in set (0.13 sec)


Con estos resultados podemos decir que en determinados casos es mas rapido usar subquery que inner join, y que establecer foreing keys hace que la consulta se ralentize sobre todo en el caso del uso de inner join

Borrado múltiple – MySQL Tips

Muchas veces nos pondemos encontrar con el caso de tener que borrar un registro de dos tablas. Por ejemplo: Tenemos una tabla pedidos a la cual llamaremos ‘pedidos’ y otra tabla a cual la llamaremos ‘lineasPedido’ pues bien, queremos que si borramos el pedido se borren tambien las lineas de pedido, y todo esto con una sola consulta.

Como campos importantes en este ejemplo vamos a tomar que pedidos tiene un campo id , y lineasPedido tiene aparte del id un campo idPedido que es el que tiene la relacion con la tabla pedidos.

Imaginemos que queremos borrar el pedido 1000, pues vamos ha hacerlo con una sola consulta:


DELETE FROM c, d  USING `pedidos` p, `lineasPedido` l
 WHERE p.id = l.idPedido AND p.id = 1000

Y con esto en una sola consulta borrariamos los datos relacionados de las dos tablas

+ Info http://dev.mysql.com/doc/refman/5.1/en/delete.html