Archive for the ‘ mySql ’ Category

seleccionar entradas aleatoriamente en mySql

La idea de este tutorial se basa en la siguiente situación: Hemos hecho una competencia donde se encontraba un formulario donde los participantes dejaban sus datos. La competencia corre por cuatro semanas y tenemos que elegir un ganador cada semana.
Como seguridad también en vez de elegir sólo un ganador elegiremos 5 ganadores de forma que contactémos al primero y en caso que no cumpla con los requisitos de la política de privacidad llamaremos al segundo y así sucesivamente.

Bueno el código es muy fácil, se basa en la utilización de rand() que es una funcion incluida en mysql.

1
SELECT * FROM  `competicion` ORDER BY RAND( ) LIMIT 1";

Como había comentado antes quiero seleccionar 5 ganadores que sean de la semana x y que no hayan ganado (la semana en la que han ingresado se guarda en la db al momento de registro) por lo que la consulta nos quedaría de la siguiente forma:

1
$sql = "SELECT * FROM  `competicion` WHERE semana =  'primera' AND gano =  'no' ORDER BY RAND( ) LIMIT 5";

Con eso ya tenemos todo, utilizando PHP se nos hace bien fácil enviarnos los resultados a nuestro email o simplemente imprimirlo en la pantalla.
El código completo sería algo como:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$semana='primera';
$sql = "SELECT * FROM  `competicion` WHERE semana = '$semana' AND gano =  'no' ORDER BY RAND( ) LIMIT 5";
 
 
$result = mysql_query($sql);
 
if (!$result) {
    echo "No se pudo correr la consulta ($sql) de la DB: " . mysql_error();
    exit;
}
 
if (mysql_num_rows($result) == 0) {
    echo "No se encontraron registros";
    exit;
}else{
 
	while ($row = mysql_fetch_assoc($result)) {
		$fecha=date('l jS \of F Y h:i:s A',$row['time']);
		$ganador.="Id: ".$row["id"]."\nTitle: ".$row['titulo']."\nNombre: ".$row['nombre']."\nApellido: ".$row['apellido']."\nEmail: ".$row['email']."\nEdad: ".$row['edad']."\nRespuesta: ".$row['respuesta']."\nTime: ".$fecha."\n\n\n";
	}
 
	mysql_free_result($result);
	$to='email del administrador o quien vaya a chequear que el ganador sea genuino';
	mail($to,"ganador de la semana ".$semana,$ganador);
	echo "la lista de ganadores ha sido enviada a $to";
 
}

msql siguiente y previo

Un problema muy común es generar una serie de registros y para luego mostrarlos en un front end, estos registros pueden ser una tabla con imagens, usuarios productos, etc. El problema consiste en que una vez que mostramos uno de estos productos queremos agregar dos botones uno para ver el registro siguiente y otro para el anterior. y uno diria bueno todo bien hago una consulta preguntado cual es el id proximo mas grande en el caso de estar buscando el siguiente registro de la siguiente forma:

1
2
3
SELECT field1
FROM tabla
WHERE id = ($idActual + 1)

Y el anterior seria lo mismo

1
2
3
      SELECT campo
      FROM tabla
      WHERE id = ($idActual - 1)

Hasta Acá todo bien , el problema surge cuando eliminamos un registro y nuestros id salta. por ejemplo eliminamos el registro 26 y nuestro registro actual es el 27. mysql no va a encontrar el registro numero 26 ($idActual – 1) y va a devolver una fila vacía.

La solución es bien simple:
En vez de usar el operador = para encontrar el id exacto que estamos buscando y luego sustraerle uno, lo que vamos a hacer es seleccionar todos los registros menores a nuestro registro actual usando el operador < y limitando el resultado a uno. De forma que para encontrar el próximo menor nos quedaría de la siguiente manera:

1
2
3
4
5
SELECT campo
      FROM tabla
      WHERE ID < $idActual
      ORDER BY id DESC
      LIMIT 1

y para el registro mayor:

1
2
3
4
5
SELECT campo
      FROM tabla
      WHERE ID > $idActual
      ORDER BY id ASC
      LIMIT 1

Espero que les sea útil.

Formatear fechas Mysql

Hoy encontré una pagina muy práctica que te ayuda a formatear fechas usando la funcion MySQL DATE_FORMAT. Es muy fácil de usar sólo hace falta cambiar el desplegable en el formato que queremos el resultado y nos genera la consulta que debemos utilizar. Muy útil, espero que les sirva.

http://www.mysqlformatdate.com/

eliminar duplicados mysql

Me parece útil ir publicando trucos que me solucionan la vida. Esta semana estaba trabajando con varias tablas y sin querer me ingresaron varias entradas duplicadas sin darme cuenta al final del día tenía 1557 entradas duplicadas, que si hubiese tenido que borrar una por una con el phpmyadmin me hubiese tomado mínimo media hora. Entonces investigué como hacer una consulta que automatice la acción.
Lo que hay que hacer es una tabla temporal con la misma estructura, pero vacía, para que nos sirva de backup y copiar los registros de la original excluyendo los duplicados, luego borramos la original y renombramos la temporal con el nombre de la original.

La consulta es la siguiente:

INSERT INTO `nombre_de_la_nueva_tabla` SELECT DISTINCT * FROM `nombre_de_la_tabla_original`.
Espero que a alguien le sea útil