Ver Mensaje Individual
  #14 (permalink)  
Antiguo 10/06/2011, 09:04
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con una consulta anidada

Gracias por la data.
Reconstruí estas dos tablas y las cargué con lo que me pasaste, luego de lo cual hice dos consultas. La primera usando tu primer post; la segunda haciendo un INNER JOIN mejorado:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM productos,subproducto
  3.     -> WHERE productos.idPro = subproducto.idPro;
  4. +-------+-------+---------------------------------+-----------------------------------+----------+-------+-------+--------------------------------+------------+------+
  5. | idPro | valor | nomPro                          | carPro                            | idSubPro | idPro | valor | nomSubPro                      | desSubPro  | ruta |
  6. +-------+-------+---------------------------------+-----------------------------------+----------+-------+-------+--------------------------------+------------+------+
  7. |     2 | si    | D·ctos de Ventilaci¾n de PVC    |                                   |        1 |     2 | si    | Ducto Impelante de PVC         | dwcasdcasd |      |
  8. |     2 | si    | D·ctos de Ventilaci¾n de PVC    |                                   |        2 |     2 | si    | Ducto Aspirante de PVC         | asvadva    |      |
  9. |     3 | si    | Ventiladores ElÚctricos Axiales |                                   |        3 |     3 | si    | Ventilador Axial tipo A        |            |      |
  10. |     3 | si    | Ventiladores ElÚctricos Axiales |                                   |        4 |     3 | si    | Ventilador Axial tipo B        |            |      |
  11. |     2 | si    | D·ctos de Ventilaci¾n de PVC    |                                   |        5 |     2 | si    | codo para ducto de ventilaci¾n | asdvasdv   |      |
  12. |     5 | no    | Ventilador CentrÝfugo           | ┐Que es un Ventilador CentrÝfugo? |        6 |     5 | si    | Ventilador CentrÝfugo Tipo H   |            |      |
  13. +-------+-------+---------------------------------+-----------------------------------+----------+-------+-------+--------------------------------+------------+------+
  14. 6 rows in set (0.00 sec)
  15.  
  16. mysql> SELECT P.idPro, S.idSubPro, P.nomPro, S.nomSubPro, S.desSubPro, P.carPro, P.valor, P.valor, S.ruta
  17.     -> FROM
  18.     ->   productos P
  19.     ->   INNER JOIN
  20.     ->   subproducto S USING(idPro, valor)
  21.     -> WHERE P.valor='si'
  22.     -> ORDER BY P.idPro;
  23. +-------+----------+---------------------------------+--------------------------------+------------+--------+-------+-------+------+
  24. | idPro | idSubPro | nomPro                          | nomSubPro                      | desSubPro  | carPro | valor | valor | ruta |
  25. +-------+----------+---------------------------------+--------------------------------+------------+--------+-------+-------+------+
  26. |     2 |        1 | D·ctos de Ventilaci¾n de PVC    | Ducto Impelante de PVC         | dwcasdcasd |        | si    | si    |      |
  27. |     2 |        2 | D·ctos de Ventilaci¾n de PVC    | Ducto Aspirante de PVC         | asvadva    |        | si    | si    |      |
  28. |     2 |        5 | D·ctos de Ventilaci¾n de PVC    | codo para ducto de ventilaci¾n | asdvasdv   |        | si    | si    |      |
  29. |     3 |        3 | Ventiladores ElÚctricos Axiales | Ventilador Axial tipo A        |            |        | si    | si    |      |
  30. |     3 |        4 | Ventiladores ElÚctricos Axiales | Ventilador Axial tipo B        |            |        | si    | si    |      |
  31. +-------+----------+---------------------------------+--------------------------------+------------+--------+-------+-------+------+
  32. 5 rows in set (0.01 sec)
En ambos casos, lo que obtuve es lo que esperaba: los datos coincidentes de la primera tabla se repiten una vez por cada instancia diferente de la segunda. En este sentido la consulta funciona exactamente como se espera y como debe funcionar.
Así es la tabla resultado de la consulta. Siempre.

Entonces volví a tu primer post:
Cita:
Productos:
Poleras de Algodón:
Poleras Rojas
Poleras Blancas
Poleras Amarillas

Pero me esta duplicando el producto por cada subproducto, o sea:

Productos:
Poleras de Algodón:
Poleras Rojas

Poleras de Algodón:
Poleras Blancas

Poleras de Algodón:
Poleras Amarillas

Espero se entienda el problema.
Hay dos cosas distintas:
La primera lista que quieres no se obtiene solamente con la consulta. Tienes que manipular el resultado para crear esa tabla en la salida del script de PHP. No se puede hacer de otro modo porque MySQL siempre te repetirá esos primeros campos en cada instancia distinta de subproducto.
La segunda lista es la consecuencia de una condición ineficiente, porque no estabas considerando qué valor debía tener la columna "valor" en ambas tablas, y terminabas con registros que no debían usarse.
Lo que se te hacía difícil de manipular era que el ordenamiento era caótico. Algunos registros del mismo producto aparecían en posiciones incorrectas.

Sintetizando: Haz la consulta como te la paso y luego usa un for/next para recorrer la tabla, analizando en cada vuelta si cambia el valor del nombre de producto para poner el encabezado.
Eso MySQL no te lo puede hacer porque devuelve tablas, no reportes.

Tip final: Noto que estás trabajando tablas relacionadas, pero sin usar FK. Deberías considerar cambiar de tablas MyISAM a InnoDB para mantener mejor la integridad referencial
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)