| Subcribe via RSS

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

Noviembre 3rd, 2008 | 3 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 | 2 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 | 9 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: ,

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: , , ,

Activar el log de querys en MySQL

Diciembre 4th, 2007 | No Comments » | Posted in mysql, ubuntu

Si alguna vez necesitas hacer un seguimiento de las queries (o consultas) que está haciendo una aplicación puedes hacerlo activando el log de queries de MySQL.

Edita el fichero: /etc/mysql/my.cnf

busca la línea:

#log		= /var/log/mysql/mysql.log

y quita la almohadilla del comienzo (que sirve para convertir la línea en un comentario).

Puedes usar un archivo diferente de: /var/log/mysql/mysql.log, pero asegúrate de que MySQL tiene persmisos de escritura en él.

Después basta con reiniciar el MySQL:

sudo /etc/init.d/mysql restart

Una vez hecho esto todas las querys quedarán almacenadas en este archivo. No es muy recomendable tenerlo activado en un servidor en producción ya que podría ralentizar mucho las consultas.

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: , ,

Chuleta para MySQL

Octubre 31st, 2006 | 2 Comments | Posted in mysql

Navegando por Google me he encontrado hoy con esta chuleta para mysql. Muy útil sobre todo para principiantes.

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: , , ,

EasyPHP: Servidor Apache+PHP+MySQL en Windows

Septiembre 3rd, 2006 | 1 Comment | Posted in mysql, php

La manera más sencilla de tener un servidor Apache+PHP+MySQL en Windows es EasyPHP:

EasyPHP

La instalación es muy cómoda y queda todo perfectamente configurado, incluyendo PHPMyAdmin.