2

Soy algo nuevo en esto y estoy intentando que aparezcan todas las subcategorías, pero solamente aparece una

Ya probé con foreach, pero no funciono, aunque no descarto que haya echo algo mal

Este es el código:

<?php
$sql = mysqli_query($con,"SELECT categorias.*, subcategorias.* FROM categorias, subcategorias WHERE categorias.id = subcategorias.id ORDER BY subcategorias.id ASC");
while($row = mysqli_fetch_array($sql))
{
    ?>
    <li>
        <a class="parent" href="#"><?php echo $row['ctitulo'];?></a>
        <ul class="sub-menu">
            <li><a href="#"><?php echo $row['stitulo'];?></a></li>
        </ul>
    </li>
    <?php
}
?>

Categorias Categorias

Subcategorias Subcategorias

BetaM
  • 30,571
  • 7
  • 32
  • 50
Hyperion
  • 21
  • 3

1 Answers1

1

Parte 1

Considero que el problema lo tienes aquí:

WHERE categorias.id = subcategorias.id

Puesto que en la condición estás solicitando filas únicamente cuando las llaves primarias en ambas tablas empaten, sin embargo:

  • Si existen menos categorías que subcategorías entonces las subcategorías sobrantes es decir que su PK no tengan su correspondiente valor no serán parte de la salida

Parte 2

Considera revisar lo siguiente:

Si hablamos de que una categoría tiene muchas subcategorías entonces la consulta puede quedar de esta forma:

SELECT categorias.*, subcategorias.*
FROM categorias
INNER JOIN subcategorias ON categorias.id = subcategorias.categoria_id;

Usamos la sintaxis regular de joins y en la condición indicamos que las filas devueltas serán siempre y cuando la llave primaria de las categorías sea igual a la llave foránea almacenada por cada fila de las subcategorías.

Es decir algo (muy reducido) de esta forma:

categorias        subcategorias
id                id
......            ..........
......            ..........
                  categoria_id <----- esta sería la llave foránea

Donde tendré la salida esperada que es:

  • Todas las categorías que tengan al menos una subcategoría asociada por medio de su correspondencia entre llave primaria y llave foránea.

Edición

Quedando así la consulta:

SELECT categorias.nombre, GROUP_CONCAT(subcategorias.nombre)
FROM categorias
INNER JOIN subcategorias ON categorias.id = subcategorias.categoria_id
GROUP BY categorias.nombre;
BetaM
  • 30,571
  • 7
  • 32
  • 50
  • Muchísimas gracias, es mi primera vez preguntando y me sorprendió ver tanta ayuda. Ya voy a chequear lo de las llaves foráneas, de los joins ya leí un poco, pero leeré eso que me pasaste también – Hyperion May 24 '21 at 02:47
  • Una pregunta más, se soluciono lo anterior, ahora aparecen todas las subcategorías, pero las categorías se duplican, ósea, si hay una categoría con dos subcategorías o más, está se duplica, no se si me explico, ahí te paso una foto. Esto es lo que sucede: https://i.ibb.co/bsYYsgb/2.png – Hyperion May 24 '21 at 03:31
  • Muchísimas gracias, me has salvado!! – Hyperion May 28 '21 at 09:16