Foros del Web » Programando para Internet » PHP »

Problema con consulta mysql y php

Estas en el tema de Problema con consulta mysql y php en el foro de PHP en Foros del Web. Hola, El problema es el siguiente, tengo una tabla en la que almaceno canciones diferentes y la tabla tiene los siguientes campos: | id | ...
  #1 (permalink)  
Antiguo 12/07/2005, 12:26
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Exclamación Problema con consulta mysql y php

Hola,

El problema es el siguiente, tengo una tabla en la que almaceno canciones diferentes y la tabla tiene los siguientes campos:

| id | titulo | interprete | genero | categoria |

lo que necesito hacer es seleccionar varias melodias en orden aleatorio y que ademas no coincida el genero y la categoria de la anterior.

para elegirla de manera aleatoria se que debo generar primero un numero aleatorio esto lo hago con la funcion rand(min,max) y luego ejecutar la consulta de esta manera:

$num = rand(1,50);
$sql = "SELECT * FROM `canciones` WHERE `id` = '$num' LIMIT 1";

esto me devuelve una cancion aleatoria, pero ahora como hago para que no coincida en genero y categoria de la anterior cancion.

Ojala alguien me pueda ayudar
  #2 (permalink)  
Antiguo 12/07/2005, 12:59
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 meses
Puntos: 0
Antes que nada has de saber el género y categoría de la canción anterior. Para ello has de seleccionar tambien estos valores en tu consulta.
Se me ocurre que podrías guardar esta información en dos campos de la tabla con un insert. Podrías hacerlo colocando una bandera (un 1 por ejemplo) que al cabo de un número determinado de consultas a la tabla desapareciera.

Al hacer la consulta añades la condición de que $genero y $categoria sean distintas de 1.
Código PHP:
$num rand(1,50);
$sql "SELECT * FROM `canciones` WHERE `id` = '$num' and '$genero' != '1' and '$categoria' != '1'  LIMIT 1"
Creo que la solución va por ahí.

Saludos
  #3 (permalink)  
Antiguo 12/07/2005, 18:39
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Cita:
Iniciado por javifo
$num = rand(1,50);
$sql = "SELECT * FROM `canciones` WHERE `id` = '$num' and '$genero' != '1' and '$categoria' != '1' LIMIT 1";
Oye el 1 significa para la consulta el ultimo genero y el otro 1 la ultima categoria, por que la consulta que me dijiste funciona, lo unico es que cuando el numero aleatorio que genero con rand(1,50) coincide con una fila que tiene un genero ò una categoria igual a la de la ultima cancion simplemente no la pone o sea omite el resultado dejando el espacio en blanco.

Esto es el codigo que estoy poniendo

<html>
<head></head>
<body>

<?php
numero_melodias = 1; // numero de melodias a mostrar
while ($num_melodias <= 10) {
$numero = rand(1,50);
$i = mysql_query("SELECT * FROM `canciones` WHERE `id` = '$numero' and `genero` != '$last_gene' and `generico` != '$last_cat'",$conectar);
$cancion = mysql_fetch_array($i);
$last_gene = $cancion['genero']; // aqui guardo el ultimo genero
$last_cat = $cancion['categoria']; // aqui guardo la ultima categoria
$num_melodias++;
?>

<table border="0">
<tr>
<td><? echo($cancion['titulo']); ?></td>
</tr>

<? } // termina el bucle ?>

</table>
</body>
</html>

No se que se pueda hacer o si estoy poniendo algo mal.

Saludos
  #4 (permalink)  
Antiguo 13/07/2005, 01:54
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 meses
Puntos: 0
Hola.

Es normal que te pase esto. No pensé que la consulta no recogería ningúna canción con genero y categoría 1.

Lo que se me ocurre es que puedes completar la consulta de modo que si el resultado es nulo vuelva a hacer otra selección aleatoria buscando esta vez sólo en canciones y generos cuya categoría sea distinta a las últimas.
Código PHP:
$numero2 rand(1,50);
$sql "SELECT * FROM `canciones` WHERE `id` = '$numero2' and '$genero' != '$last_gene' and '$categoria' != '$last_cat' LIMIT 1"
El problema estaría en que si $numero2 fuese una canción con 1, el resultado volvería a ser nulo y tendías que hacer una nueva selección.

Pero quizá no te haga falta en esta consulta generar un número aleatorio y podrías hacer solo:
Código PHP:
$sql "SELECT * FROM `canciones` WHERE '$genero' != '$last_gene' and '$categoria' != '$last_cat' LIMIT 1"
No se si es la mejor solución, pero creo que funcionaría.

Cordiales saludos.
  #5 (permalink)  
Antiguo 13/07/2005, 10:44
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Si, ya compuse el bucle para que cuando sea nulo el resultado, simplemente seleccione una cancion que sea diferente en genero y categoria.

Tu solucion me funciono muy bien.

Gracias.
  #6 (permalink)  
Antiguo 13/07/2005, 14:51
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Sonrisa

Por si a alguien le sirve el codigo que me funciono es este

<html>
<head></head>
<body>

<?php
numero_melodias = 1; // numero de melodias a mostrar
while ($num_melodias <= 10) {
$numero = rand(1,50);
$i = mysql_query("SELECT * FROM `canciones` WHERE `id` = '$numero' and `genero` != '$last_gene' and `generico` != '$last_cat'",$conectar);
$cancion = mysql_fetch_array($i);
if ($cancion['genero'] == $last_gene OR $cancion['categoria'] == $last_cat) {
$tema2 = mysql_query("SELECT * FROM $lugar WHERE `genero` != '$last_gene' and `generico` != '$last_cat'",$conectar);
$cancion = mysql_fetch_array($tema2);
} // termina el if de la coincidencia
$last_gene = $cancion['genero']; // aqui guardo el ultimo genero
$last_cat = $cancion['categoria']; // aqui guardo la ultima categoria
$num_melodias++;
?>

<table border="0">
<tr>
<td><? echo($cancion['titulo']); ?></td>
</tr>

<? } // termina el bucle ?>

</table>
</body>
</html>

Este codigo lo que hace es seleccionar 10 registros de una tabla llamada canciones en forma aleatoria y que ademas no coincidan en genero y categoria una de la anterior

Ojala alguien le saque provecho igual que yo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:57.