| Subcribe via RSS

MySQL: actualizar un campo con la suma de unos registros de otra tabla

Noviembre 3rd, 2008 | No Comments » | Posted in mysql, php

Si tenemos una tabla que queremos actualizar con la suma de valores de otra tabla podemos hacerlo vía programación (lo he visto en un programa que he tenido que modificar recientemente) o lo podemos hacer directamente usando una consulta MySQL.

En este ejemplo en concreto que me encontré había dos tablas:

facturas:

  • num_factura
  • base_imponible

factura_detalle:

  • num_factura
  • articulo
  • precio

La tabla factura_detalle contiene, como el nombre indica, el detalle de las facturas. Cada línea es un artículo y su precio.

La tabla facturas tenía un campo base_imponible que era necesario actualizar con el precio de los artículos de la factura en la tabla factura_detalle.

Esto se puede hacer directamente usando una subconsulta:

UPDATE facturas SET base_imponible =
     ( SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')
     WHERE num_factura = '30';

La subconsulta se encarga de buscar todos los registros de la tabla de detalle y sumar los precios:

SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')

y la consulta principal lo que hace es asignar ese valor, que sería algo así suponiendo que la anterior hubiese devuelto el valor ‘300′:

UPDATE facturas SET base_imponible = '300'
     WHERE num_factura = '30';
Tags: , , , , ,

MySQL: Importar un fichero SQL cambiando el charset

Octubre 29th, 2008 | No Comments » | Posted in mysql

En ocasiones es posible que necesites importar a una base de datos MySQL un fichero con un backup que está definido con un set de caracteres diferente al que usa la BD.

Si se importa sin más es muy posible que aparezcan caracteres extraños al ver el contenido de la base de datos.

Desde consola

Cuando esto sucede puedes indicar una condición extra en la importación para indicar el character set que vas a usar. Esta opción es: –default-character-set:

mysql -uusuario -p base_datos < fichero.sql --default-character-set=set_caracteres

Donde:
set_caracteres: es el set de caracteres de la nueva base de datos (por ejemplo utf8).
fichero.sql: es el fichero que contiene la estructura y/o datos del fichero exportado previamente.
base_datos: es la base de datos en la que vamos a guardar el contenido del fichero.

Con PHPMyAdmin

Esto también se puede hacer desde PHPMyAdmin. En la pestaña de importación de datos hay un desplegable que nos permite indicar el charset que vamos a usar.

Tags: , ,

Problemas al crear una función en MySQL: Error 1064

Octubre 27th, 2008 | No Comments » | Posted in mysql

Hace un par de días publiqué una función en MySQL que permitía contar los días entre dos fechas sin contar fines de semana. Le he usado en varios servidores pero en uno de ellos me he encontrado con un problema:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS `workdaydiff`' at line 1

Después de volverme loco un buen rato he encontrado la solución aquí:

Bastaba con añadir un punto y coma al delimitador, es decir, en lugar de:

DELIMITER $$;

usar:

DELIMITER $$

y, efectivamente, ha funcionado.

Tags: ,

Función en MySQL para contar días entre dos fechas sin contar sábados ni domingos

Octubre 21st, 2008 | 6 Comments | Posted in mysql

Después de darle muchas vueltas he encontrado esta útil función en los foros de MySQL que permite calcular el número de días que han transcurrido entre dos fechas sin contar fines de semana.

Espero que os sea tan útil como a mí.

DELIMITER $$
 
DROP FUNCTION IF EXISTS `workdaydiff`$$
CREATE FUNCTION workdaydiff(b date, a date) RETURNS int(11)
    DETERMINISTIC
    COMMENT 'working day difference for 2 dates'
BEGIN
 
DECLARE freedays int;
 
SET freedays = 0;
SET @x = DATEDIFF(b, a);
IF @x<0 THEN
SET @m = a;
SET a = b;
SET b = @m;
SET @m = -1;
ELSE
SET @m = 1;
END IF;
SET @x = abs(@x) + 1;
 
SET @w1 = WEEKDAY(a)+1;
SET @wx1 = 8-@w1;
IF @w1>5 THEN
SET @w1 = 0;
ELSE
SET @w1 = 6-@w1;
END IF;
 
SET @wx2 = WEEKDAY(b)+1;
SET @w2 = @wx2;
IF @w2>5 THEN
SET @w2 = 5;
END IF;
 
SET @weeks = (@x-@wx1-@wx2)/7;
SET @noweekends = (@weeks*5)+@w1+@w2;
 
SET @result = @noweekends-freedays;
RETURN @result*@m;
END$$
 
DELIMITER ;
Tags: ,

Python: Trabajar con MySQL

Septiembre 18th, 2008 | 2 Comments | Posted in programacion, python

En esta nueva entrega de artículos sobre Python le ha tocado el turno al MySQL.

Lo primero, si no tenemos instalado el soporte MySQL para Python debemos añadirlo al sistema. En Ubuntu podemos hacerlo así:

sudo apt-get install python-mysqldb

Existen dos formas de trabajar con MySQL, una es a través del módulo _mysql y la otra es a través de MySQLdb. _mysql es la implementación en Python de la API de C para MySQL. Se suele recomendar usar MySQLdb para trabajar, pero, cabezota que es uno yo suelo trabajar con _mysql :-P.

Para el ejemplo voy a suponer que existe una tabla llamada clientes que contiene los campos nombre y apellido.

#!/usr/bin/env python
 
import _mysql
 
# Datos para la conexión a MySQL
mysql_servidor = 'localhost'
mysql_usuario  = 'usuario'
mysql_clave    = 'clave'
mysql_bd       = 'base_datos'
 
conexion = _mysql.connect(host=mysql_servidor, user=mysql_usuario, passwd=mysql_clave, db=mysql_bd)
sql = "select * from clientes limit 10"
conexion.query(sql)
query = conexion.store_result()
if query.num_rows():
	print "Resultados\n=========="
	fila = query.fetch_row(how=1)
	while fila:
		print fila[0]["nombre"], " ", fila[0]["apellido"]
		fila = query.fetch_row(how=1)
conexion.close()

Aquí empezamos a usar conceptos algo más complicados como los diccionarios y las tuplas. Se recomienda buscar información al respecto (o igual me animo y escribo algún post sobre el tema).

Algunos comentarios:

1) fetch_row() tiene un parámetro opcional llamado how que indica cómo se devuelven los resultados. Si se especifica el valor ‘1′ los devolverá como un dicconario donde la clave es el nombre del campo.

2) Uso fila[0] ya que fetch_row devuelve cada fila como un diccionario dentro de una tupla.

3) store_result(). Si se usa esta función el servidor nos envía todos los datos “de golpe”, lo que puede ser un problema si hay muchos datos. Sin embargo podemos limitar el número de resultados usando LIMIT en la SQL. También podemos usar use_result() y el servidor nos devolvera las filas una a una. Esta opción tiene la pega de que consumimos más recursos del servidor.

Tags: , , ,

PHP: Cambiar el set de caracteres en una consulta MySQL

Agosto 12th, 2008 | No Comments » | Posted in mysql, php, programacion

Existe una función, que he de reconocer no conocía, que permite cambiar el set de caracteres (charset) cuando hacemos una consulta a MySQL.

Por ejemplo, si queremos asegurarnos que los datos que vamos a introducir en la base de datos van a estar en UTF-8 usaremos:

mysql_set_charset('utf8',$link);

(donde el parámetro $link, como en casi todas las funciones para mysql, es opcional).

Esta función se ha incorporado en la versión PHP 5 (5.0.7) y por lo visto también está disponible en la versión PHP 4 (a partir de la 4.1.13). En los comentarios de la documentación de PHP han aportado este código que hace que mysql_set_charset funcione también en versiones anteriores de PHP:

<?php
 if (function_exists('mysql_set_charset') === false) {
     function mysql_set_charset($charset, $link_identifier = null)
     {
         if ($link_identifier == null) {
             return mysql_query('SET NAMES "'.$charset.'"');
         } else {
             return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
         }
     }
 }
 ?>
Tags: , , ,

MySQL y Mono

Junio 14th, 2007 | 2 Comments | Posted in mysql, programacion

Estoy empezando un proyecto en Mono y la primera dificultad que me he encontrado ha sido añadirle soporte para MySQL. Se tarda muy poco en ponerlo en marcha, lo que me ha costado ha sido descubrir cómo hacerlo:

  • Descargar el último conector de la web de MySQL. Verás que sólo hay paquetes para MS Windows. Descárgate el paquete sin instalador.
  • Descomprime el fichero y copia el fichero bin/MySql.Data.dll a tu directorio de Mono (en mi caso es /usr/lib/monodevelop/bin). En ese directorio probablemente habrá alguna otra dll. Prueba a usar el comando:
    locate .dll

    para ver dónde puede estar tu directorio. Por cierto, necesitarás permisos de administrador.

  • Registra la dll usando el comando:
    gacutil -i MySql.Data.dll

    .

  • Si usas el Monodevelop tendrás que añadir el soporte MySQL a tu proyecto. Click derecho sobre “Referencias”-> Editar Referencias -> Ensamblado .Net. Navega hasta encontrar el fichero MySql.Data.dll y pincha el botón “Añadir”.

Después de esto ya deberías ser capaz de conectarte a una base de datos MySQL sin problemas.

Tags: , ,

LAMP en Ubuntu

Septiembre 4th, 2006 | 7 Comments | Posted in apache, mysql, php, ubuntu

Instalar LAMP (abreviatura para Linux, Apache, Mysql, PHP/Perl/Phyton) en Ubuntu es sencillo:

sudo apt-get install php5 apache2 mysql-server

Es posible que no funcione el soporte PHP para MySQL, en ese caso son necesarios tres pasos más:

  1. Añadir el soporte para MySQL:
    sudo apt-get install php5-mysql
  2. Editar el fichero php.ini:
    sudo gedit /etc/php5/apache2/php.ini

    buscar la línea: ;extension=mysql.so y eliminar el ‘;’ del comienzo (’;’ es el carácter que se usa para comentar líneas en php.ini)

  3. Reiniciar apache (yo lo hago desde el panel de control de Webmin.

¡y listo! :-)

Puede que interese añadir soporte para PEAR, Curl o GD:

apt-get install php5-cli php-pear php5-curl php5-gd

Y no puede faltar PHPMyAdmin:

apt-get install phpmyadmin

Más información en inglés aquí:
http://www.linuxforums.org/servers/setting_up_a_server.html.

Tags: , , ,