Tengo dos mesas:
Categoría
| identificación | nombre | caso |
Artículos
| identificación | nombre | ID de categoría | <-- esta es la columna de relación
Estoy tratando de mostrar todas las categorías con su respectivo número de artículos, así:
Nombre de categoría: Resumen [15 elementos]
Estoy usando este código:
$getcategory = mysqli_query($con, " SELECT c.name , c.id , c.case , i.id , COUNT(i.categoriaid) AS photos FROM category c JOIN items i ON c.id = i.categoriaid WHERE i.id != '' ORDER BY c.id ASC "); while ($showcategory = mysqli_fetch_array($getcategory)) { echo ' <div class="category-container"> <div class="category-title">'.$showcategory['name'].'</div> <div class="category-img-container"> <div class="img-stretch"><img src="'.$showcategory['case'].'" alt=""/></div> </div> <div class="category-count"><div><span class="destaque alto">[ '.$showcategory['photos'].' ]</span> telas</div></div> </div> '; }Pero esto no funciona. ¿Qué ocurre?
La consulta no se ve bien. Hay un agregado en la lista SELECT y no hay cláusula GROUP BY. Si la consulta devuelve un resultado, será una sola fila. Y no tiene sentido devolver elementos no agregados en la lista SELECT, si solo vamos a devolver COUNT.
Suponiendo que id es la CLAVE PRIMARIA (o una CLAVE ÚNICA) en la tabla de category , si sql_mode no incluye ONLY_FULL_GROUP_BY, podríamos hacer que esto se ejecute:
SELECT c.name , c.id , c.case , MIN(i.id) AS min_id , MAX(i.id) AS max_id , COUNT(i.categoriaid) AS photos FROM category c LEFT JOIN items i ON i.categoriaid = c.id AND i.id <> '' GROUP BY c.id ORDER BY c.idSi sql_mode incluye ONLY_FULL_GROUP_BY, podemos usar funciones agregadas (por ejemplo, MIN o MAX) alrededor de c.name y c.case, o podemos extender la cláusula GROUP BY para incluir esas columnas.
SELECT c.name , c.id , c.case , MIN(i.id) AS min_id , MAX(i.id) AS max_id , COUNT(i.categoriaid) AS photos FROM category c LEFT JOIN items i ON i.categoriaid = c.id AND i.id <> '' GROUP BY c.id , c.name , c.case ORDER BY c.id Sin una especificación, solo estamos adivinando. Podría haber un número de cosas "incorrectas" con esta declaración. Como una lista de ejemplo: referencias de tabla no válidas, referencias de columna no válidas (¿hay una categoriaid de nombre de columna en la tabla de elementos? Lo tomé del SQL en la pregunta).
Le sugiero que lleve la escritura de SQL a otro entorno y obtenga el SQL escrito y probado. Luego, vuelva a incluir esa declaración en su código PHP. (Divide y conquistaras.)
Además, en el código PHP, podemos probar si la ejecución de la consulta fue exitosa, probando el retorno de mysqli_query . Si es FALSO, entonces sabemos que no tuvo éxito y podemos recuperar el error con la función mysqli_error .
$sql = "SELECT ... "; if( !$getcategory = mysqli_query($con,$sql) ) { // statement execution was not successful die mysqli_error($con); }