Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Contar líneas de consulta. (https://www.clubdelphi.com/foros/showthread.php?t=57452)

Ñuño Martínez 16-06-2008 12:59:16

Contar líneas de consulta.
 
Veamos. Tengo la siguiente consulta:
Código SQL [-]
SELECT `productos`.`descripcion` AS `descripcion`, SUM(`detalle_pedido`.`unidades`) AS `unidades`
  FROM `detalle_pedido`, `pedidos`, `productos`
 WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id`
   AND `detalle_pedido`.`productos_id`=`productos`.`id`
   AND '$Fecha1'<=`pedidos`.`fecha_orden` AND `pedidos`.`fecha_orden`<='$Fecha2'
 GROUP BY `detalle_pedido`.`productos_id`;
Esta me devuelve los datos que quiero, no hay problema. Lo que pasa es que también necesito saber cuántas líneas devuelve sin tener que obtener la consulta completa, ya que puede devolverme sopocientasmildos líneas, y como es para una web la cosa se puede eternizar. Lo que busco es "paginar" así que en la consulta definitiva utilizaré "LIMIT", de ahí que quiera contar las líneas.

En definitiva, me gustaría sacar algo parecido a:
Código SQL [-]
SELECT COUNT(*)
 WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id`
   AND `detalle_pedido`.`productos_id`=`productos`.`id`
   AND '$Fecha1'<=`pedidos`.`fecha_orden` AND `pedidos`.`fecha_orden`<='$Fecha2'
pero no me sale. Lo he intentado de varias maneras pero no consigo que me devuelva lo que quiero, porque o me devuelve un valor mayor al esperado o devuelve varias líneas con valores rarísimos :confused:.

El problema es que quiero saber cuántos "detalle_pedido.productos_id" distintos hay.

No sé si me he explicado. Si no quedó claro, pregunten que intentaré aclararlo. Gracias.

Caro 16-06-2008 14:53:18

Hola Nuño, te devuelve los valores raros porque estas haciendo un count sobre cada grupo. Has hecho la prueba de hacer un count sobre el resultado de tu consulta.

Código SQL [-]
SELECT count(*)
From ( SELECT `productos`.`descripcion` AS `descripcion`, SUM   
            (`detalle_pedido`.`unidades`) AS `unidades`
  FROM `detalle_pedido`, `pedidos`, `productos`
  WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id`
           AND `detalle_pedido`.`productos_id`=`productos`.`id`
           AND '$Fecha1'<=`pedidos`.`fecha_orden`
           AND `pedidos`.`fecha_orden`<='$Fecha2'
  GROUP BY `detalle_pedido`.`productos_id`)

Saluditos

Ñuño Martínez 16-06-2008 14:58:53

Pues eso es lo que quiero hacer, el problema es que me devuelve un error:
Cita:

Empezado por MySQL
#1248 - Every derived table must have its own alias

Evidentemente he puesto dos fechas válidas ;)

Yo de SQL sé lo justo...

[edito] Olvidé mencionar que utilizo MySQL, por si sirve de algo.

enecumene 16-06-2008 15:18:09

¿No debería ser así?,:

Código SQL [-]
SELECT COUNT(SELECT `productos`.`descripcion` AS `descripcion`, SUM(`detalle_pedido`.`unidades`) AS `unidades`
  FROM `detalle_pedido`, `pedidos`, `productos`
 WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id`
   AND `detalle_pedido`.`productos_id`=`productos`.`id`
   AND '$Fecha1'<=`pedidos`.`fecha_orden` AND `pedidos`.`fecha_orden`<='$Fecha2'
 GROUP BY `detalle_pedido`.`productos_id`;
),`productos`.`descripcion` AS `descripcion`, SUM(`detalle_pedido`.`unidades`) AS `unidades`
  FROM `detalle_pedido`, `pedidos`, `productos`
 WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id`
   AND `detalle_pedido`.`productos_id`=`productos`.`id`
   AND '$Fecha1'<=`pedidos`.`fecha_orden` AND `pedidos`.`fecha_orden`<='$Fecha2'
 GROUP BY `detalle_pedido`.`productos_id`;

Por cierto, no mencionaste si estás trabajando con PHP :p;).

Ñuño Martínez 16-06-2008 15:27:49

Olvidé dar las gracias a Caro por su aportación. Espero que no te molestes :)

@ecumene, pues gracias también pero no, me devuelve error de sintaxis en la séptima línea (justo en el "), `productos`,..."). Gracias de todas formas.

Y sí, estoy utilizando PHP pero el problema está en el SQL. Evidentemente las pruebas las estoy haciendo diréctamente en la base de datos y poniendo fechas reales. Así que por ahí no creo que esté el problema.

enecumene 16-06-2008 15:33:39

Bueno no se pierde nada con el intento ¿NO? :p:p:p

Caro 16-06-2008 16:00:02

Hola de nuevo nuño, el ejemplo que puse si funciona, pero en Firebird. Mysql también maneja subconsultas en el From, solo que tienes que darle un alias al resultado, revisa esta pagina http://dev.mysql.com/doc/refman/5.0/...med-views.html

Saluditos

Caro 16-06-2008 16:28:15

No habia visto el error que pusiste "
#1248 - Every derived table must have its own alias
", parece que el error es justamente por el alias que le falta a la consulta.

Código SQL [-]
SELECT count(*)From ( SELECT `productos`.`descripcion` AS `descripcion`, 
           SUM (`detalle_pedido`.`unidades`) AS `unidades`
           FROM `detalle_pedido`, `pedidos`, `productos`
           WHERE `detalle_pedido`.`pedidos_id`=`pedidos`.`id` 
           AND `detalle_pedido`.`productos_id`=`productos`.`id`
           AND '$Fecha1'<=`pedidos`.`fecha_orden`
           AND `pedidos`.`fecha_orden`<='$Fecha2'
           GROUP BY `detalle_pedido`.`productos_id`) AS Resultado

Saluditos

Ñuño Martínez 16-06-2008 16:29:06

Gracias [Caro]. :)

Ahora me sale error porque dice que la función SUM no existe, pero creo que eso puedo solucionarlo. Si no lo consigo, ya preguntaré.

roman 16-06-2008 17:21:57

Creo que en lugar de la subconsulta- que podría ser muy tardada- podrías usar found_rows en combinación con SQL_CALC_FOUND_ROWS en la consulta. Con eso se supone que puedes saber cuántos registros hay en total sin no se usara LIMIT, de manera que puedes usarlo para paginar.

// Saludos

Ñuño Martínez 16-06-2008 22:52:10

¿Y por qué no me lo has dicho antes? ;):p:D

Gracias roman, lo tendré en cuenta.


La franja horaria es GMT +2. Ahora son las 05:36:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi