Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

195
Vistas
MySQL - Recuento de unión interna de dos tablas

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.id

Si 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); }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda