Búsquedas anidadas en MySQL (o algo por el estilo)

Estoy haciendo mi primer proyecto desde CERO para una pequeña página web con información de capítulos de varias series de TV. Decidí usar MySQL y PHP para generar las diferentes páginas de mi sitio. La idea es que yo pueda ir agregando datos en la base de datos y las páginas se vayan llenando solas de información sin que yo tenga que estar agregando código todo el tiempo. Resumiendo, como funcionaría cualquier página actual donde el diseño el fijo y lo que varía es el contenido.

Por ahora me valí de diferentes tutoriales para aprender lo básico sobre como integrar MySQL a un PHP. Pero ahora he llegado a un punto donde no puedo avanzar porque mucho no comprendo de programación.

Mi base de datos tiene diferentes tablas (una por cada serie), cada una con 5 columnas, donde cada fila correspondería a un capítulo diferente
Id (que es un # único que representaría a cada entrada)
Temporada (también en número, este dato se repite)
Capitulo (también en número, se repite al volver a empezar la numeración con cada temporada)

Nombre (texto con el nombre del capítulo)
Url (una dirección única)

Ej: 0, 2, 12, Un Día Después, http://www.pagina.com/informaci%C3%B3n

La estructura de lo que necesitaría sería lo siguiente:

Una función que me permita primero encontrar la cantidad de temporadas, y luego a cada temporada ingresarle los capítulos correspondientes a cada una, seguido de un link con información de cada uno.

Lo que pude hacer hasta ahora es que me devuelva todos los datos de cada una de las entradas con el formato que yo quiero (ej, el nombre del capítulo es un link activo que me lleva a la url de la base de datos). Hasta ahí todo bien. El problema es que cuando busco me devuelve siempre el número de la temporada, cuando en realidad lo que necesito es que me agrupe los datos, y no me repita todo el tiempo con cada uno de los capítulos el número de la temporada.

El código que uso es el siguiente (contiene código de jquery mobile):

¿
 <?php
$link = mysql_connect('localhost','usuario','clave') or die ('Error conectando a la base de datos');
$dbname = 'basededatos';
mysql_select_db($dbname, $link);
$result = mysql_query("SELECT * FROM seriedetv ORDER BY temporada", $link);
  if ($row = mysql_fetch_array($result)){  
    echo '<div data-role="collapsible">';
    do {
      echo "<h3>Temporada ".$row["temporada"]."</h3>";
      echo '<ul data-role="listview" data-inset="true">';
      echo "<li><a href=".$row["url"].">".$row["capitulo"].")".$row["nombre"]."</a></li>";
    } while ($row = mysql_fetch_array($result));
    echo "</ul></div> \n";
  } else {
  echo "¡No se ha encontrado ningún registro!";
  }
?> 

Lo que me devuelve en formato es correcto, pero no es lo que busco. Me repite en cada búsqueda los datos del número de la temporada, cuando en realidad hace falta una sola vez para usarla de encabezado.

Necesito primero que me liste todas las temporadas y darle un formato. Y luego dentro de cada temporada hacer una búsqueda de los capítulos correspondientes, y ordenarlos según su número (capitulo).

Según algo entiendo, ¿creo qué debería ingresar otra búsqueda luego de la 9na línea? Pero creo que igual no funcionaría porque me repetiría el resultado de las temporadas con cada uno de los capítulos existentes... Lo que necesito es que me devuelva solo una vez el resultado de cada temporada. No se si me explico.

Es como ordenar posts por categoría. Cada post tiene la información sobre a qué categoría pertenece. Si hago una búsqueda de las categorías, no quiero que me repita mil veces los nombres de las categorías (porque hay muchos posts en cada categoría) sino que me devuelva solo los títulos sin repetirlos.

Perdón por ser tan extenso. Traté de ser lo más claro posible y que no haya dudas...
¿Alguien puede darme una mano? ¿O recomendarme alguna página para leer?

1 Respuesta

Respuesta
1

Tratare de ayudarte lo mas que pueda.

Según lo que entendí mi solución seria manejar 2 querys, uno dentro de otro, en el primero colocaría el select utilizando la instrucción DISTINCT de mysql para que me agrupe los datos por el concepto deseado y en el segundo la consulta filtrada por dicho concepto.

Mandame un ejemplo de como necesitas que se muestre en la pagina y si es posible mandame la liga.

Aun no tengo la página subida. Había pensado en algo así también, que primero haga la búsqueda de las Temporadas, y luego dentro de esa búsqueda liste todos los capítulos.

La página tendría que quedar:

Temporada 1
-----1) Nombre <-- es un link a otra página
-----2) Nombre <-- es un link a otra página
-----3) Nombre <-- es un link a otra página 
Temporada 2
-----1) Nombre <-- es un link a otra página
-----2) Nombre <-- es un link a otra página
-----3) Nombre <-- es un link a otra página  

Etcétera...

Hasta ahora lo que pude hacer es que me liste correctamente las temporadas, con el formato que yo quería (sin que se repitan como me pasaba antes) y dentro de ellas los capítulos con los links y demás como yo quiero.

El tema es que me repite TODOS los capítulos en cada una de las temporadas. O sea, no puedo hacer que solo me devuelva los capítulos correspondientes a cada temporada.

Pego a continuación el código modificado que tengo hasta ahora (incluye código para formato jquery mobile):

 <?php
  $link = mysql_connect('localhost','nombredeusuario','contraseña') or die ('Error conectando a la base de datos');
  $dbname = 'basededatos';
  mysql_select_db($dbname, $link);
  $temporada = mysql_query("SELECT DISTINCT temporada FROM seriedetv ORDER BY temporada", $link);
    if ($temp = mysql_fetch_array($temporada)){
      do {
        echo '<div data-role="collapsible">';
        echo "<h3>Temporada ".$temp["temporada"]."</h3>";
        echo '<ul data-role="listview" data-inset="true">';
        $capitulos = mysql_query("SELECT url, capitulo, nombre FROM seriedetv ORDER BY capitulo", $link);
        if ($cap = mysql_fetch_array($capitulos)){
          do {
            echo "<li><a href=".$cap["url"].">".$cap["capitulo"].") ".$cap["nombre"]."</a></li>";
          } while ($cap = mysql_fetch_array($capitulos));
        }
        echo "</ul>";
        echo "</div> \n";
      } while ($temp = mysql_fetch_array($temporada));
    } else {
    echo "¡No se ha encontrado ningún registro!";
    }
?>

¡Muchas gracias!

Solo modifica la siguiente linea:

Solo cambia la siguiente linea.

En caso de que el campo temporada lo tengas declarado en la BD como entero.

$capitulos = mysql_query("SELECT url, capitulo, nombre FROM seriedetv where temporada = ".$temp["temporada"]." ORDER BY capitulo", $link);

En caso de que la tengas declarada como cadena.

$capitulos = mysql_query("SELECT url, capitulo, nombre FROM seriedetv where temporada = '".$temp["temporada"]."' ORDER BY capitulo", $link);

Solo cambian unos apostrofes.

Esto tiene que ser suficiente para que obtengas lo que necesitas.

Cualquier duda escríbeme.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas