Ir al contenido


Foto

¿Consejos para optimizar una consulta con COUNT()?


  • Por favor identifícate para responder
1 respuesta en este tema

#1 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 19 marzo 2014 - 05:11

Estoy trabajando sobre una consulta con COUNT y la verdad es que no sé cómo hacerlo sin tener que hacer varias consultas. Mi objetivo es poder hacerlo solamente en una, pero de momento no lo he conseguido.

Tengo 3 tablas, cada una con la siguiente estructura



delphi
  1. CREATE TABLE `categories` (
  2.   `idcategorie` int(11) NOT NULL AUTO_INCREMENT,
  3.   `iduser` int(11) DEFAULT NULL,
  4.   `categorie` varchar(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  5.   PRIMARY KEY (`idcategorie`),
  6.   KEY `iduser_idx` (`iduser`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='categorias principales. es padre de subcategories.'





delphi
  1. CREATE TABLE `subcategories` (
  2.   `idsubcategorie` int(11) NOT NULL AUTO_INCREMENT,
  3.   `idcategorie` int(11) DEFAULT NULL,
  4.   `subcategorie` varchar(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  5.   PRIMARY KEY (`idsubcategorie`),
  6.   KEY `fk_idcategorie_idx` (`idcategorie`),
  7.   CONSTRAINT `fk_idcategories` FOREIGN KEY (`idcategorie`) REFERENCES `categories` (`idcategorie`) ON DELETE NO ACTION ON UPDATE NO ACTION
  8. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='sirve para clasificar los posts. subcategories tiene clave foranea de la clave primaria de posts'





delphi
  1. CREATE TABLE `posts` (
  2.   `idpost` int(11) NOT NULL AUTO_INCREMENT,
  3.   `author` varchar(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  4.   `date_time` datetime DEFAULT NULL,
  5.   `title` varchar(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  6.   `post` mediumtext COLLATE utf8_spanish2_ci,
  7.   `conclusion` mediumtext COLLATE utf8_spanish2_ci,
  8.   `footer` varchar(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  9.   `idsubcategorie` int(11) DEFAULT NULL,
  10.   PRIMARY KEY (`idpost`),
  11.   FULLTEXT KEY `post_index` (`post`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci



El objetivo de la consulta es obtener todas las entradas de categories, todas las entradas de subcategories relacionadas con cada entrada de categories, un count de todas las entradas de subcategories y otro count de todas las entradas de posts.

Esta es la consulta que he preparado



delphi
  1. use miblog;
  2.  
  3. SELECT C.*, S.*, COUNT(S.idsubcategorie), COUNT(P.idpost) FROM categories C, subcategories S, posts P group by S.idsubcategorie



Este es el resultado

# idcategorie, iduser, categorie, idsubcategorie, idcategorie, subcategorie, COUNT(S.idsubcategorie), COUNT(P.idpost)
1                 1  Programación 1                            1                    PHP                  4                                                4
1                 1  Programación 2                            1                    MYSQL    4                                                4
1              1  Programación 3                    2                  En convivencia 4                                              4


El problema es evidente. Si bien obtengo todos los resultados agrupados por subcategories, los resultados de COUNT() no son los que tienen que ser, porque en realidad solamente hay dos entradas en posts y 3 entradas en subcategories (hay una subcategorie que no tiene posts asignado todavía).

No sé cómo poder hacer que COUNT() devuelva el número real de entradas de posts y subcategories, tampoco sé exactamente por qué COUNT devuelve 4 totales para subcategories y 4 totales para posts :s

¿Alguien puede ayudarme?
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 20 marzo 2014 - 10:54

Estas pidiendo todas las combinaciones de las 4 tablas (no usas que una subcategoria pertenece a una categoria ni que un post es de una subcategoria) y el count() cuenta lineas, y tu SQL tiene 4 lineas, por eso todos los count valen 4, y tampoco creo que vayas a poder mezclar todo eso en u solo query (com qwuisieras que saliese el resultado: una linea de tu SQL corresponde a... eso es lo que no veo claro en absoluto).

Si pones cual sería la salida que quieres conseguir podemos hablar, pero con lo que pones no sé que es lo que quieres conseguir, sobre todo qué representa cada línea de tu query (una categoria, una subcategoria, etc).
  • 0




IP.Board spam blocked by CleanTalk.