• Español
  • Blog

Mysql Blog en Español

Mysql página en español
  • Home
  • Contact
  • Log in
  • Mysql Blog en Español

  • Trucos e ayuda con Mysql.

  • Categories

    • Todos
    • Aprendiz
    • Bienvenid@
    • Gestión etc.
    • Trucos avanzado
    • Recently
    • Archives
    • Categories
    • Latest comments
  • Search

  • Blogroll

    • b2evolution
      • Blog news
      • Manual
      • Support
      • Web hosting
    • contributors
      • dAniel
      • Danny
      • Francois
      • Yabba
  • XML Feeds

    • RSS 2.0: Posts, Comments
    • Atom: Posts, Comments
    What is RSS?

enlaces

By admin on Feb 16, 2010 | In Aprendiz, Trucos avanzado | Send feedback »

Sólo quería entrar en un par de cosas que son de interés para aquellos que utilizan o programan de Mysql. En primer lugar, si uses Twitter la mejor manera de buscar artículos relacionados con MySQL es entrar #mysql en el campo de búsqueda.
En segundo lugar, este parece ser un enlace ideal para explorar más comandos en Mysql:
sentencias-en-mysql-que-tal-ves-no-conocias

Tags: twitter

Proyecto Euler 2 en Mysql

By admin on Sep 5, 2009 | In Trucos avanzado | Send feedback »

Aquí está la pregunta 2 del Proyecto de Euler The Euler Project :
Cada nuevo número de la secuencia de Fibonaci se genera sumando los dos números que lo preceden.
Empezando por el 1 y el 2, los diez primeros números serán:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Hallar la suma de todos números pares de la secuencia de Fibonaci que no exceda de cuatro millónes.


Pues, en cuanto a una solución de Perl, tenemos el siguiente código

Code:

#!/usr/bin/perl
 
@f=(1,2);
$sum=2;
while(($f=$f[0]+$f[1]) <= 4_000_000) {
       shift @f; push @f,$f;
$sum+=$f if $f%2==0 }
print $sum, "\n";
# Answer = 4613732

Vemos que el programa Perl se suma a $sum donde la variable $f es un número par, y los lazos hasta que el valor cambiado en la memoria (que se añade a cada valor anterior para producir la serie de Fibonacci) es superior a 4.000.000.


¿Cómo podemos lograr esto en MySQL? Una vez más (como en la primera entrada) vamos a utilizar variables para iterar. Con el fin de obtener la secuencia de Fibonacci se puede utilizar este...

Code:

set @varsum=1;
set @varadd=1;
set @var1=1;
set @var2=1;
 
select @varsum:=@varadd+@varsum as fibonacci,
       @varadd:=@var2,
       @var2:=@varsum, orderid
from orders limit 40;


(orders es una tabla que yo uso que tiene miles de filas).
Puse 40 en la cláusula de LIMIT después de un poco de ensayo y error. Recuerdes restaurar las variables cada vez que se ejecuta una consulta como esta.
A continuación, puede hacer una suma de los valores devueltos cuando el valor de Fibonacci es menos de 4 millones de dólares, mediante un INNER SELECT:

Code:

set @varsum=1;
set @varadd=1;
set @var1=1;
set @var2=1;
 
select sum(fibonacci) from (select @varsum:=@varadd+@varsum as fibonacci,@varadd:=@var2,@var2:=@varsum, orderid from orders limit 40) tmp where fibonacci < 4000000;

Pero estamos sumando todos los números haciendo esto - el problema dice que sólo debe sumar los números pares de la secuencia. Modificar fácilmente (véte la solución para el número 1) utilizando la función MOD:

Code:

set @varsum=1;
set @varadd=1;
set @var1=1;
set @var2=1;
 
select sum(fibonacci) from
(select @varsum:=@varadd+@varsum as fibonacci,
@varadd:=@var2, @var2:=@varsum
from orders limit 40) tmp
where fibonacci < 4000000
and mod(fibonacci,2)=0;
 
+----------------+
| sum(fibonacci) |
+----------------+
|        4613732 |
+----------------+
1 row in set (0.27 sec)


Espero que este código es de utilidad para alguien.
Saludos, Mark

Tags: mod, project euler, variables

Proyecto Euler 1 en Mysql

By admin on Sep 1, 2009 | In Aprendiz, Trucos avanzado | Send feedback »

Hola, he llegado recientemente a través del Proyecto de Euler http://projecteuler.net/ que plantea retos matemáticos en cualquier lenguaje de codificación que prefieres utilizar.
Entonces no estoy diciendo que MySQL es especialmente apto para afrontar estos retos, pero me preguntaba si yo podría resolver uno o dos solamente por el uso de MySQL.

He aquí la primera cuestión

Si hacemos una lista de los numeros naturales múltiplos de 3 ó 5, menores de 10.
Obtenemos 3,5,6 y 9. La suma de estos múltiplos es 23.

Hallar la suma de todos los multiplos de 3 o 5 menores de 1000.

En primer lugar voy a investigar la forma en que se puede hacer en Perl y luego ver cómo se puede aplicar esto en Mysql. (La siguiente es una adaptación de una solución Perl que he encontrado en Euler_problems_as_perl_oneliners )

#!/usr/bin/perl
# adds each multiple of 3 to $n
# then adds each mutiple of 5 to $n unless divisible by 3
# to avoid duplication!

$n=0;
for($i=3;$i<1000;$i+=3) {$n+=$i}

for($i=5;$i<1000;$i+=5)
{$n+=$i unless $i%3 == 0}
print $n, "\n";

# produces 233168


Por mi código de MySQL voy a empezar por ver cómo probar si un número es divisible por otro número en sql. Una forma es utilizar la función de MOD que devuelve el resto exacto tras la división (Es operación de módulo). Por lo tanto, debe retornar 0, cuando el número es divisible por tu numero de prueba. Asi, select mod(9,3); retorna 0 mientras select mod(8,2); retorna 2.

A continuación, necesitamos una manera de reiterar hasta 999 (es decir, todos los números por debajo de 1000). Suelo usar una tabla llena con números ascendentes para este tipo de tarea; sin embargo, es posible utilizar una técnica de variables, siempre que se inscriba a una tabla de base de datos con el número necesario de filas en él. Por ejemplo, si tenemos una tabla llamada orders con 20.000 registros, se puede traer de vuelta a tan sólo 20 filas numeradas como este:

Code:

select @rownum:=@rownum+1 'row_num', e.* from orders e,    
(SELECT @rownum:=0) r
order by orderid desc limit 20


Así, con el fin de traer de vuelta a todos aquellos en los que el row_num campo es divisible por 3, ponemos el código anterior en un SELECT interno (Inner Select):

Code:

select row_num from
(select @rownum:=@rownum+1 'row_num'
from orders e,    
(SELECT @rownum:=0) r  
order by orderid desc limit 20) tmp
where mod(row_num,3) = 0;


Por último añadir una cláusula de OR incluir números divisibles por 5, y suma el resultado:

Code:

select sum(row_num) from
(select @rownum:=@rownum+1 'row_num'
from orders e,    
(SELECT @rownum:=0) r  
order by orderid desc limit 999) tmp
where mod(row_num,3) = 0 or mod(row_num,5) = 0;

Esto da una respuesta de: 233168. Se volvió bastante rápidamente también - apenas 0,08 de segundo! Hasta pronto!

Tags: mod, perl, project euler, variables
1 2 3 4 5 6 7 8 >>
  • Enlaces

    foro de mysql
    Planetmysql
    Blog magnifico sobre muchas cosas
    DBRunas
    Guía rápida de administración de MySQL
    Foros del Web
    Bases de datos en castellano
    Manual de Mysql 5

    Excel Ayuda!
    Excel en Castellano

    Perl!
    Guia para resolver cualquier problema Perl

    En inglés
    Cheat Sheet
    cosas de dba
  • Indice

    • enlaces
    • Proyecto Euler 2 en Mysql
    • Proyecto Euler 1 en Mysql
    • Trucos y consejos útiles
    • Problemas de importación de los campos de fecha de Excel
    • Rápida solución para problema de Perl.
    • Más información sobre las variables.
    • Hacer las consultas más eficiente (3) - La importancia de los índices
    • Cambio de Host
    • Hacer las consultas más eficiente 2) la optimización de las consultas sql.
    • Hacer las consultas más eficiente 1) La localización de las consultas que se ejecutan lentamente
    • Encontrar duplicados
    • Potente manipulación de la cadena.
    • Comprobar que un campo contiene texto
    • Consultas con GROUP BY
    • Código hermoso
    • Poner Innodb en marcha
    • Variables de SQL
    • Ordenar los resultados de consulta
    • Trucos de Command Line
powered by b2evolution free blog software

©2010 by admin | Contact | evoCamp skin | Credits: Blog Design | blog software | web hosting | monetize