Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Marciano_79 en 3 Abril 2016, 02:28 am



Título: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 3 Abril 2016, 02:28 am
Hola a todos, favor chicos.. estoy hace un mes tratando de poder solucionar una consulta que me está entregando registros duplicados, en algunos casos hasta triplicados… trabajo con MySqli y la verdad es que he probado de tantas formas que ya no se que más hacer... no soy programador, por ello si me explico mal favor tener paciencia vale? estas son mis tablas..

Tabla categoria:
IDCATEGORIA
NOMBRE_CATEGORIA

Tabla galerias:
IDGALERIAS
TITULO
DESCRIPCION
FECHA_ALTA
NOMBRECATEGORIA
FKCATEGORIA_ID

mi codigo:

Código:
if( isset( $_GET['cat'] ) ){  
   $id = $_GET['cat'];
        $consulta ="SELECT DISTINCT
  IDGALERIA,
  TITULO,
  DESCRIPCION,
  NOMBRECATEGORIA,
  FKCATEGORIA_ID,
  DATE_FORMAT( FECHA_ALTA, '%d/%m/%Y' ) AS FECHA_ALTA,
  IDCATEGORIA,
  NOMBRE_CATEGORIA  

FROM galerias a INNER JOIN categoria b ON a.NOMBRECATEGORIA='$id'";
       

$filas = mysqli_query($cnx, $consulta);
$columna = mysqli_fetch_assoc($filas);
echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
    
}

dejo una imagen del resultado devuelto actualmente.. la tabla que se ve en rojo es lo que obtengo y la que esta en azul es lo que realmente quiero que se visualice..

(http://fotos.subefotos.com/7d5b193c35352fd5d84903ae310cf85do.jpg)

Esto es el resultado de la categoría retrato, pero ocurre también en las distintas otras categorías que tengo, moda, infantiles etc… todas entregan el mismo resultado... Porfavor alguien amable me pueda ayudar.. de ante mano muchas gracias.!!


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: engel lex en 3 Abril 2016, 02:33 am
Código:
SELECT DISTINCT (IDGALERIA)


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 3 Abril 2016, 02:41 am
no funciona amigo, todo queda igual..  :(


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: engel lex en 3 Abril 2016, 05:27 am
ya que estás usando join lo recomendable es usar el formato tabla.campo no es necesario que redeclares como a y b, hazlo directo

Código
  1. SELECT DISTINCT
  2.                  (galerias.IDGALERIA),
  3.                  galerias.TITULO,
  4.                  galerias.DESCRIPCION,
  5.                  categoria.NOMBRECATEGORIA,
  6.                  categoria.FKCATEGORIA_ID,
  7.                  DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS galeria.FECHA_ALTA,
  8.                  categoria.IDCATEGORIA,
  9.                  categoria.NOMBRE_CATEGORIA  
  10.  
  11.               FROM galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA=catgoria.'$id'

o como sea tu orden




Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 3 Abril 2016, 05:56 am
Gracias por tu tiempo y disponibilidad, pero la verdad esto no quiere funcionar, probé así como me dices y nada..  

Código:
"SELECT DISTINCT  
 (galerias.IDGALERIA),
  galerias.TITULO,
  galerias.DESCRIPCION,
  galerias.NOMBRECATEGORIA,
  galerias.FKCATEGORIA_ID,
  DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS galerias.FECHA_ALTA,
  categoria.IDCATEGORIA,
  categoria.NOMBRE_CATEGORIA  

FROM galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA=categoria.'$id'";

me sale esto: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\prueba\galeria-fotografica.php on line 54

sinceramente me tiene mal la situación... que crees que pueda hacer? Gracias por tu ayuda..


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 3 Abril 2016, 21:46 pm
cambiando la consulta o forma seria opción?


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: HdM en 4 Abril 2016, 12:04 pm
Deberías enlazar correctamente las dos tablas en la consulta ¿no?

IDCATEGORIA <-> FKCATEGORIA_ID


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 4 Abril 2016, 16:50 pm
Por lo general unes las columnas con ON y dejas las restricciones en WHERE pero esto puede funcionar. Claro que no debería ser:

Código
  1. ... ON galerias.NOMBRECATEGORIA=categoria.'$id'

Sino:

Código
  1. ... ON galerias.NOMBRECATEGORIA='$id'

No es necesario usar nombres de tabla en este caso porque no hay una ambigüedad en las tablas (o vistas parciales), si tuvieras tablas con campos que usan el mismo nombre entonces si necesitas especificar el nombre con la tabla (aunque en mi opinión es más claro ver de donde salen los campos en la consulta).

El alias de la función DATE_FORMAT no necesita especificarse un campo de la tabla:

Código
  1. DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA_ALTA

DISTINCT no es una función (no es necesario los paréntesis).

En fin, nada de esto explica porque obtuviste esos resultados anteriormente, la consulta que muestras debería regresar esas hileras para los campos que aparecen en tu documento de excel, pero en tu documento no estás mostrando los valores de las otras columnas (son 8 columnas las que seleccionas en tu consulta, tu documento de excel solo muestra 5).


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: HdM en 4 Abril 2016, 21:23 pm
Para mi, el que los campos que indiqué no estén enlazados en la consulta, si explica los resultados "erróneos" obtenidos. ¿Cómo sabe el motor qué registros de una y otra tabla extraer, si ambas no están enlazadas en la query en cuestión?

En este caso concreto, sabe que tiene que extraer los registros de la tabla galerias por:

Código
  1. ON galerias.NOMBRECATEGORIA='$id'

pero no de la tabla categoria (y entiendo que por tanto sacará todos los registros de la misma. De ahí la repetición de los mismos).

Justo lo contrario sucedería si en vez del ON anterior, fuese:

Código
  1. ON categoria.NOMBRE_CATEGORIA='$id'

extraería los registros correctos de la tabla categoría y todos los registros de la tabla galerías.

Por tanto, consultas tales como:

Código
  1. SELECT
  2.       DISTINCT  galerias.IDGALERIA,
  3.       galerias.TITULO,
  4.       galerias.DESCRIPCION,
  5.       galerias.NOMBRECATEGORIA,
  6.       galerias.FKCATEGORIA_ID,
  7.       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ),
  8.       categoria.IDCATEGORIA,
  9.       categoria.NOMBRE_CATEGORIA
  10. FROM
  11.      galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA = categoria.NOMBRE_CATEGORIA  
  12.      AND galerias.NOMBRECATEGORIA = '$id';
  13.  

Código
  1. SELECT
  2.       DISTINCT  galerias.IDGALERIA,
  3.       galerias.TITULO,
  4.       galerias.DESCRIPCION,
  5.       galerias.NOMBRECATEGORIA,
  6.       galerias.FKCATEGORIA_ID,
  7.       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ),
  8.       categoria.IDCATEGORIA,
  9.       categoria.NOMBRE_CATEGORIA
  10. FROM
  11.        galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA = categoria.NOMBRE_CATEGORIA
  12. WHERE
  13.        galerias.NOMBRECATEGORIA = '$id';
  14.  

Código
  1. SELECT
  2.       DISTINCT  galerias.IDGALERIA,
  3.       galerias.TITULO,
  4.       galerias.DESCRIPCION,
  5.       galerias.NOMBRECATEGORIA,
  6.       galerias.FKCATEGORIA_ID,
  7.       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ),
  8.       categoria.IDCATEGORIA,
  9.       categoria.NOMBRE_CATEGORIA
  10. FROM
  11.       galerias, categoria
  12. WHERE
  13.       galerias.NOMBRECATEGORIA = categoria.NOMBRE_CATEGORIA  
  14.       AND galerias.NOMBRECATEGORIA = '$id';
  15.  

y equivalentes, mostrarán los resultados deseados.



Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 4 Abril 2016, 21:55 pm
Ah cierto, de la primera forma se realiza un producto cruzado entre $id y todos las hileras de categoria, aunque en su ejemplo solo tiene una categoría al parecer. También deberías poder hacer:

Código
  1.    ON galerias.NOMBRECATEGORIA = '$id' AND categoria.NOMBRE_CATEGORIA = '$id'

Aunque en mi opinión es mejor si vas por la segunda proposición de HdM.

Esto todavía no explica porque tienes registros duplicados en tus resultados. Si tu tienes resultados tal cuales lo has mostrado en tu imagen, no deberías tener resultados duplicados.

DISTINCT opera sobre las hileras de tus resultados. Supongamos que tienes 2 tablas A y B con un solo campo.

Código:

 A | B
--------
 1 | 2
   | 3
   | 4
   | 5
   | 6

Si tu haces:

Código
  1. SELECT * FROM A INNER JOIN B -- INNER JOIN se vuelve CROSS JOIN

Acabas con una tabla asi:

Código:
-------
|1 | 2|
-------
|1 | 3|
-------
|1 | 4|
-------
|1 | 5|
-------
|1 | 6|
-------

Si tu usas DISTINCT aquí, acabarás con la misma tabla, porque cada uno de los registros de la tabla es único. Si tuvieras una tabla así:


Código:

 A | B
--------
 1 | 1
   | 1
   | 1
   | 1
   | 1

E hicieras la misma consulta tendrías:

Código:
-------
|1 | 1|
-------
|1 | 1|
-------
|1 | 1|
-------
|1 | 1|
-------
|1 | 1|
-------

Si usarás DISTINCT para los resultados de esta consulta acabarías con:

Código:
-------
|1 | 1|
-------

Por eso mismo dije que lo mencionado hasta ahorita no explica el resultado de tu tabla, porque los resultados que muestras son idénticos y reducibles por DISTINCT. La única forma para la cual tendrías estos valores duplicados sería que los otros valores de las columnas que no muestras son diferentes.

Por ejemplo, veo ahí un campo IDGALERIA que no estoy seguro si sea o no único. Si el campo es un identificador que se auto incrementa por cada registro seleccionar ese campo va a producir que cada hilera sea diferente (por ende DISTINCT no los descarta).


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 5 Abril 2016, 00:33 am
 :o Ohh gracias se pasaron voy a probar de inmediato toda estas respuestas que me han entregado... mil gracias, les comento pronto los resultados.!!


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 5 Abril 2016, 02:12 am
Hola muchas gracias por responder e intentar ayudarme…. He probado hacer los ajustes que me recomiendan, pero el resultado lamentablemente sigue igual,  incluso en algunos casos aplicando los cambios, el resultado es que se desaparece algunas galerías de fotos y se mezclan todos los resultados en las diferentes categorías de forma idéntica… con estas consultas

Código
  1. 1
  2.  
  3. "SELECT DISTINCT
  4.  galerias.IDGALERIA,
  5.  galerias.FKCATEGORIA_ID,
  6.  galerias.DESCRIPCION,
  7.  galerias.NOMBRECATEGORIA,
  8.  galerias.TITULO,
  9.  DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA_ALTA,
  10.  categoria.IDCATEGORIA,
  11.  categoria.NOMBRE_CATEGORIA  
  12.  
  13.  
  14. FROM galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA = categoria.NOMBRE_CATEGORIA
  15. WHERE galerias.NOMBRECATEGORIA='$id'";
  16.  
  17. ----------------------------------------------------------------------------------
  18. 2
  19.  
  20. "SELECT DISTINCT
  21.  galerias.IDGALERIA,
  22.  galerias.FKCATEGORIA_ID,
  23.  galerias.DESCRIPCION,
  24.  galerias.NOMBRECATEGORIA,
  25.  galerias.TITULO,
  26.  DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA_ALTA,
  27.  categoria.IDCATEGORIA,
  28.  categoria.NOMBRE_CATEGORIA  
  29.  
  30.  
  31. FROM galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA='$id' AND categoria.NOMBRE_CATEGORIA = '$id'";

y el resultado es este: Lo que está en rojo es el valor devuelto, y lo que está en azul es como debería estar (con este resultado les muestro que no tengo solo una categoría de galerías fotográficas)

PD: deje tal cual la fecha ya que con el cambio propuesto este dejaba de mostrarse

(http://fotos.subefotos.com/ca08bdbf0b3e78733be920fae337a9f8o.jpg)

Resumen: tengo 3 galerías Retrato, 2 galerías Moda, y 1 galería Infantil. Total 6 galerías creadas… hasta el momento solo veo 5 galerías juntas sin orden y todas aparecen de igual forma por cada pagina de cada categoría

Ahora voy a dejar el código completo ya que entremedio hay otras consultas de otras tablas que tal vez puedan estar generando conflicto…

Este es para el menú donde llamo a las categorías, y se impriman en pantalla por su nombre:

index.php

Código
  1. <?php
  2. include('panel/_setup.php');
  3.  
  4. $consulta =<<<SQL
  5. SELECT DISTINCT
  6.     IDCATEGORIA,
  7.     NOMBRE_CATEGORIA
  8. FROM
  9.     categoria
  10.  
  11. INNER JOIN galerias ON categoria.IDCATEGORIA=galerias.FKCATEGORIA_ID
  12.  
  13. ORDER BY
  14. IDCATEGORIA ASC
  15.  
  16. SQL;
  17.  
  18. $filas = mysqli_query($cnx, $consulta);
  19.  
  20. ?>
  21.  
  22. <title>Galerías</title>
  23. <link rel="stylesheet" href="css/stylenew.css"/>
  24. </head>
  25.  
  26. <body>
  27. <div id="principal">
  28. <h1>Selección de Categorias</h1>
  29.       <?php
  30.  
  31.  
  32. while( $id = mysqli_fetch_assoc($filas)){
  33.     echo '<div>';
  34. echo "<a href='galeria-fotografica.php?cat=$id[NOMBRE_CATEGORIA]'>$id[NOMBRE_CATEGORIA]</a>";
  35. echo '</div>';
  36. }
  37. ?>
  38.  
  39. </div>

Resultado: galería-fotografica.php?cat=Retrato
               galería-fotografica.php?cat=Moda
               galería-fotografica.php?cat=Infantiles


y el otro código donde esta la consulta que me da problemas:

galeria-fotografica.php

Código
  1. <?php
  2. include('panel/_setup.php');
  3.  
  4. ?>
  5. <title>Galerías</title>
  6. <link rel="stylesheet" href="css/stylenew.css"/>
  7. </head>
  8.  
  9. <body>
  10. <div id="principal">
  11.  
  12. <?php
  13.    if( isset( $_GET['gal'] ) ){
  14. $id = $_GET['gal'];
  15. $consulta = "SELECT DESCRIPCION, TITULO FROM galerias WHERE IDGALERIA='$id'";
  16. $filas = mysqli_query($cnx, $consulta);
  17. $col = mysqli_fetch_assoc($filas);
  18.  
  19. echo "<h2>$col[TITULO]</h2>";
  20.        echo "<p>$col[DESCRIPCION]</p>";
  21.        echo '<a href="javascript:history.back(-1);" title="Ir la página anterior">VOLVER ATRAS</a>';
  22.        echo '<div id="ver_galeria">';
  23.  
  24.        $consulta ="SELECT * FROM FOTOS WHERE FKGALERIA='$id' AND ESTADO='visible' ORDER BY POSICION";
  25.        $filas = mysqli_query($cnx, $consulta);
  26.        while( $col = mysqli_fetch_assoc($filas)){
  27. echo '<div>';
  28. echo '<img src="fotos/'.$col['ARCHIVO'].'" alt="'.$col['NOMBRE'].'" />';
  29.  
  30. echo '</div>';
  31.  }
  32.          echo '</div>';  
  33.  
  34.  
  35. }else{
  36.  
  37.  
  38. if( isset( $_GET['cat'] ) ){  
  39.    $id = $_GET['cat'];
  40.        $consulta ="SELECT DISTINCT
  41.                         galerias.IDGALERIA,
  42.         galerias.FKCATEGORIA_ID,
  43.         galerias.DESCRIPCION,
  44. galerias.NOMBRECATEGORIA,
  45. galerias.TITULO,
  46.         DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA_ALTA,
  47. categoria.IDCATEGORIA,
  48.                         categoria.NOMBRE_CATEGORIA  
  49.  
  50.  
  51. FROM galerias INNER JOIN categoria ON galerias.NOMBRECATEGORIA='$id' AND categoria.NOMBRE_CATEGORIA = '$id'";
  52.  
  53.  
  54. $filas = mysqli_query($cnx, $consulta);
  55. $columna = mysqli_fetch_assoc($filas);
  56. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
  57.  
  58. }
  59. echo '<div id="listado">';
  60. while( $columna = mysqli_fetch_assoc($filas)){
  61.  $id = $columna['IDGALERIA'];
  62.  $subconsulta = "SELECT ARCHIVO FROM fotos WHERE FKGALERIA='$id' AND ESTADO='visible' ORDER BY RAND() LIMIT 1";
  63.  $filas2 = mysqli_query($cnx, $subconsulta);
  64.  $datos = mysqli_fetch_assoc($filas2);
  65.  
  66.  $nombre_archivo = $datos['ARCHIVO'];
  67.  
  68.  echo '<div>';  
  69.  echo "<h2>$columna[TITULO]</h2>";
  70.  echo "<div>$columna[FECHA_ALTA]</div>";
  71.  if( $nombre_archivo != null ){
  72.  echo "<img src='fotos/$nombre_archivo' alt='Preview de la galeria' />";
  73.  }
  74.  echo "<p>". nl2br( $columna['DESCRIPCION'])."</p>";
  75.  echo "<a href='galeria-fotografica.php?gal=$columna[IDGALERIA]'>VER GALERIA</a>";
  76.  echo '</div>';
  77.  }
  78.  echo '</div>';
  79.  
  80.  
  81.  
  82.    }
  83.  
  84.  
  85. ?>
  86.  
  87.  
  88. </div>

y la info de mis tablas:

Estructura de tabla para la tabla categoria


|Columna|Tipo|Nulo|Predeterminado

IDCATEGORIA|tinyint(25)|No
NOMBRE_CATEGORIA varchar(100)|Sí NULL

Volcado de datos para la tabla categoria


|1|Retrato
|2|Moda
|3|Infantiles



Estructura de tabla para la tabla galerias


|Columna|Tipo|Nulo|Predeterminado

IDGALERIA tinyint(25) No
TITULO varchar(100) Sí NULL
FECHA_ALTA datetime Sí NULL
DESCRIPCION text Sí NULL
NOMBRECATEGORIA varchar(100) Sí NULL
FKCATEGORIA_ID tinyint(20) Sí NULL

Volcado de datos para la tabla galerias

|1|Retrato-1| 2016-03-30 14:54:27 |bla,bla,bla |Retrato  |1
|2|Infantiles-1 |2016-03-30 14:55:22 |bla,bla,bla,bla,bla,bla |Infantiles  |3
|3|Retrato-2|2016-03-30 14:57:18|bjbbbk|Retrato |1
|4|Moda-1|2016-03-30 14:59:03|hvv,vgvhjvjhv,j|Moda |2
|5|Moda-2|2016-03-30 14:59:55|vhvhv|Moda |2
|6|Retrato-3|2016-03-30 15:00:35|cttdtftdtft|Retrato |1


dejo tambien la de tabla fotos (que no creo que sea de importancia, pero porsiacaso..



Estructura de tabla para la tabla fotos


|Columna|Tipo|Nulo|Predeterminado

|IDFOTO |int(25) |No|
|NOMBRE|varchar(100)|Sí|NULL
|ARCHIVO|varchar(100)|Sí|NULL
|POSICION|tinyint(3)|Sí|NULL
|ESTADO|enum('visible', 'invisible')|Sí|NULL
|FKGALERIA|tinyint(3)|Sí|NULL

Volcado de datos para la tabla fotos

|1|gdrgdrg |6ebbdb026d9c9.jpg|1|visible|1
|2|hajhajhjsh |fe4ba595921ffbbdd8.jpg|2|visible|1
|3|ajajskanka |d4cc19c8fbfdbe.jpg|1|visible|2
|4|nnjnjnjn |3d52dc1b7b.jpg|2|visible|2
|5|jojojojo |ab5788e01f4.jpg|1|visible|3
|6|knknknk |430ca7182b3.jpg|2|visible|3
|7|ububu |ad5d51bea35ff.jpg|1|visible|4
|8|addwbdb |b93635e8e092.jpg|2|visible|4
|9|sincinansn|6ba1b35d71d4d519748e9aa8b42c07f1.jpg|1|visible|5
|10|scknakcnkasnc|4dee3e3a41c53fd82de1b3227d1df372.jpg|2|visible|5
|11|sjcjsajcbjasbcjab|bf681c114a1f857ab8883143f4660246.jpg|1|visible|6
|12|scsjcnjasncj|629eef20bc75c576e931cc181296a3d7.jpg|2|visible|6


Espero estos datos puedan aportar mayor ayuda... espero con ansias sus respuestas.. muchas gracias de verdad.!


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 5 Abril 2016, 04:39 am
Siento que la pregunta ha cambiado totalmente. Pero lo que estoy viendo es que tus campo IDGALERIA, TITULO, DESCRIPCION, etc son todos diferentes, lo cual explica tus hileras repetidas en la primera imagen que pusiste. La última imagen que has puesto es un simple JOIN.

Código
  1. SELECT categoria.IDCATEGORIA,
  2.       categoria.NOMBRECATEGORIA,
  3.       galerias.TITULO,
  4.       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,
  5.       galerias.DESCRIPCION,
  6.       fotos.ARCHIVO
  7. FROM galerias
  8. INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  9. INNER JOIN fotos ON galerias.IDGALERIA = fotos.FKGALERIA

Puedes restringir los resultados al titulo de una categoria con WHERE:

Código
  1. ... WHERE categoria.NOMBRECATEGORIA = '$id'

Esto debe mostrarte 6 resultados de acuerdo a lo que has puesto:

Citar
|1|Retrato-1| 2016-03-30 14:54:27 |bla,bla,bla |Retrato  |1
|2|Infantiles-1 |2016-03-30 14:55:22 |bla,bla,bla,bla,bla,bla |Infantiles  |3
|3|Retrato-2|2016-03-30 14:57:18|bjbbbk|Retrato |1
|4|Moda-1|2016-03-30 14:59:03|hvv,vgvhjvjhv,j|Moda |2
|5|Moda-2|2016-03-30 14:59:55|vhvhv|Moda |2
|6|Retrato-3|2016-03-30 15:00:35|cttdtftdtft|Retrato |1

Sin embargo en tu tabla tienes 8 registros, aparecen Moda-3 e Infantiles-2. Para la información que tienes la consulta que he puesto debe funcionar. Pero las imagenes que pones no concuerda exactamente con tu información. Si quieres solucionar un problema real, vas a tener que plantear el problema real con información real. Nada de hipotéticas por favor, que ya van varias personas que intentan solucionar problemas ficticios en este tema y no es justo para ellos.

Otros detalles que puedo ver en tu script de PHP:

Realizas subconsultas separadas cuando pueden ser escritas bajo una consulta y estás saltandote el primer registro para obtener las cabeceras de tu apartado.

Código
  1. $filas = mysqli_query($cnx, $consulta);
  2. $columna = mysqli_fetch_assoc($filas);
  3. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
  4.  
  5. }
  6. echo '<div id="listado">';
  7. while( $columna = mysqli_fetch_assoc($filas)){
  8.  $id = $columna['IDGALERIA'];

Cuando llamas a mysqli_fetch_assoc, lees la primea fila y el puntero de $filas cambia a la siguiente fila. Por lo que cuando entras en el while, empiezas a imprimir desde la segunda fila. Básicamente pierdes la información de la primera fila.

Si vas a usar la consulta que te he puesto (que hace el inner join con la tabla de fotos tambien) te sugiero que agregues a los campos selecionados el campo de ESTADO. Verificas en cada hilera si el estado es visible o no (muy parecido a como lo tienes ahora).


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 5 Abril 2016, 05:05 am
Hola gracias por responder.. tienes toda la razón, con respecto a resultados ficticios, el tema es que había eliminado esos registros la noche anterior y al volcar los datos de las tablas hoy, me entrego lógicamente los nuevos, no me di cuenta.. lo siento mucho, para nada es mi intención hacer perder el tiempo a nadie.. de verdad mil disculpas.! ahora voy a intentar hacer los cambios que me planteas, y ademas como dije al comienzo del post "yo no soy programador" y haré mi mayor esfuerzo por comprender bien todo lo que me dices.. muchas gracias.!!  :)


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 6 Abril 2016, 00:41 am
Amigo, gracias por tu ayuda, pero no sé cómo agregar el campo ESTADO en especial, el verificar si el estado es visible o no, ya la cabeza se me parte… quiero hacerlo como me indicas tu, todo en una misma consulta, pero ya no sé cómo y la ignorancia y frustración ya se apodero de mi... en este script, implemente la consulta que me entregaste...

Código
  1. <?php
  2. if( isset( $_GET['cat'] ) ){  
  3.    $id = $_GET['cat'];
  4.        $consulta ="SELECT DISTINCT
  5.                       categoria.IDCATEGORIA,
  6.       galerias.IDGALERIA,
  7.                       galerias.NOMBRECATEGORIA,
  8.                       galerias.TITULO,
  9.                       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,  
  10.       galerias.DESCRIPCION,
  11.       fotos.ARCHIVO,
  12.       fotos.ESTADO
  13. FROM galerias
  14. INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  15. INNER JOIN fotos ON galerias.IDGALERIA = fotos.FKGALERIA
  16. WHERE galerias.NOMBRECATEGORIA = '$id'";  
  17.  
  18.  
  19. $filas = mysqli_query($cnx, $consulta);
  20. $columna = mysqli_fetch_assoc($filas);
  21. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
  22.  
  23. }
  24. echo '<div id="listado">';
  25. while( $columna = mysqli_fetch_assoc($filas)){
  26.  $id = $columna['IDGALERIA'];
  27.  
  28.  $datos = mysqli_fetch_assoc($filas);
  29.  
  30.  $nombre_archivo = $datos['ARCHIVO'];
  31.  
  32.  echo '<div>';  
  33.  echo "<h2>$columna[TITULO]</h2>";
  34.  echo "<div>$columna[FECHA]</div>";
  35.  if( $nombre_archivo != null ){
  36.  echo "<img src='fotos/$nombre_archivo' alt='Preview de la galeria' />";
  37.  }
  38.  echo "<p>". nl2br( $columna['DESCRIPCION'])."</p>";
  39.  echo "<a href='galeria-fotografica.php?gal=$columna[IDGALERIA]'>VER GALERIA</a>";
  40.  echo '</div>';
  41.  }
  42.  echo '</div>';
  43.  
  44.  
  45.  
  46.    }
  47.  
  48.  
  49. ?>
  50.  



Gracias a tu consulta, los resultados son muy buenos, me muestra los 6 registros que tengo, en las categoría retrato tengo las 3 galerías, en categoría moda, tengo las 2 galerías  y en categoría infantil aparece la única que tengo.. en la imagen se puede apreciar mejor:

(http://fotos.subefotos.com/ef867195d9fec4d2b3d3a1219d495e5eo.jpg)

Porfavor puedes ayudarme a modificar bien el código para que se vea los registros faltantes, en este caso ARCHIVO. que pertenecía a la subconsulta
"SELECT ARCHIVO FROM fotos WHERE FKGALERIA='$id' AND ESTADO='visible' ORDER BY RAND() LIMIT 1";

 Ya que realmente no sé cómo hacerlo, porfavor.!! Mil gracias de nuevo..



Título: Re: Problema con una consulta no funciona Distinct
Publicado por: HdM en 6 Abril 2016, 15:01 pm
Creo que esta consulta se ajustaría a tu necesidad:

Código
  1. SELECT DISTINCT
  2.                       categoria.IDCATEGORIA,
  3.       galerias.IDGALERIA,
  4.                       galerias.NOMBRECATEGORIA,
  5.                       galerias.TITULO,
  6.                       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,  
  7.       galerias.DESCRIPCION,
  8.      IFNULL((SELECT fotos.ARCHIVO FROM fotos WHERE galerias.IDGALERIA = fotos.FKGALERIA AND ESTADO='visible' ORDER BY RAND()  LIMIT 1),'NO APARECE') AS ARCHIVO
  9. FROM
  10.                     galerias INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  11. WHERE
  12.                     galerias.NOMBRECATEGORIA = '$id'


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 6 Abril 2016, 17:55 pm
¿Cada galería tiene por lo menos una foto verdad? No me había dado percatado de las otras limitantes de tu subconsulta, pero en teoría deberías poder realizar un LEFT JOIN así:

Código
  1. SELECT categoria.IDCATEGORIA,
  2.       categoria.NOMBRECATEGORIA,
  3.       galerias.TITULO,
  4.       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,
  5.       galerias.DESCRIPCION,
  6.       fotos.ARCHIVO
  7. FROM galerias
  8. INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  9. LEFT JOIN
  10.    (SELECT * FROM (
  11.       SELECT FKGALERIA,
  12.              ARCHIVO
  13.       FROM fotos
  14.       WHERE estado = 'visible'
  15.       ORDER BY RAND()
  16.    ) AS tmp
  17.    GROUP BY tmp.FKGALERIA) AS fotos
  18. ON galerias.IDGALERIA = fotos.FKGALERIA
  19. WHERE categoria.NOMBRECATEGORIA = '$id'

Los mismos detalles aplican a tu código. El LEFT JOIN considera que puede o no haber un valor que intersecta con la tabla de fotos. Todavía tienes el detalle que te mencione en tu código. No hace falta si quiera que recojas el valor directamente de la consulta porque sabes bien que el nombre de la categoría es igual a tu variable $_GET['cat'].

La consulta tiene algunos otros detalles como el agrupamiento de columnas no agregadas... En MySQL 5.7 esto probablemente no funcione. La consulta también está expuesta a inyecciones SQL.


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 6 Abril 2016, 19:44 pm
Muchas gracias HdM y MinusFour para mi es impagable vuestra ayuda... y si MinusFour cada galería tiene una imagen como tumb que la toma al azar de su propio álbum :) verificare las consultas ahora mismo.... aun así me surge la siguiente duda: "es necesario que al aplicar esta consulta anidada (si es que se dice así) la ejecución de este tipo de sentencias requiere la utilización de la función: mysqli_multi_query($conexion,sentencia_multiple) o no"?

Gracias nuevamente..


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 6 Abril 2016, 20:19 pm
Hasta donde yo se, esa función es para lanzar multiples queries al servidor. E.g.:

Código
  1. SELECT * FROM A; -- Query 1
  2. SELECT * FROM B; -- Query 2


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 6 Abril 2016, 22:20 pm
Ok, amigos, probé las dos consulta que me dieron, pero se hacia un caos en todos los registros, solo aparecían una galería y sin imágenes ni nada, en otras con imágenes pero faltando galerías, y otras sin nada  de nada...

Ahora al dejar la propuesta de la penúltima consulta que me entregaste, es la que mejor funciona, de hecho ahora con unas modificaciones que hice se pueden ver todas las galerías, con sus respectivas categorías y sus fotos "tumb" lo único que faltaría es el RAND para que los tumb o fotos de las galerías cambien de forma aleatoria.. así deje el código:

Código
  1. if( isset( $_GET['cat'] ) ){  
  2.    $id = $_GET['cat'];
  3.        $consulta ="SELECT DISTINCT
  4.                       categoria.IDCATEGORIA,
  5.       galerias.IDGALERIA,
  6.                       galerias.NOMBRECATEGORIA,
  7.                       galerias.TITULO,
  8.                       DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,  
  9.       galerias.DESCRIPCION,
  10.       fotos.ARCHIVO,
  11.       fotos.ESTADO
  12.       FROM galerias
  13. INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  14. INNER JOIN fotos ON galerias.IDGALERIA = fotos.FKGALERIA
  15.  
  16. WHERE galerias.NOMBRECATEGORIA = '$id'";  
  17.  
  18.  
  19. $filas = mysqli_query($cnx, $consulta);
  20. $columna = mysqli_fetch_assoc($filas);
  21. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
  22.  
  23. }
  24. echo '<div id="listado">';
  25. $filas = mysqli_query($cnx, $consulta);
  26. while( $columna = mysqli_fetch_assoc($filas)){
  27.  
  28.  $id = $columna['IDGALERIA'];
  29.  
  30.  $datos = mysqli_fetch_assoc($filas);
  31.  
  32.  $nombre_archivo = $datos['ARCHIVO'];
  33.  
  34.  echo '<div>';  
  35.  echo "<h2>$columna[TITULO]</h2>";
  36.  echo "<div>$columna[FECHA]</div>";
  37.  if( $nombre_archivo != null ){
  38.  echo "<img src='fotos/$nombre_archivo' alt='Preview de la galeria' />";
  39.  }
  40.  echo "<p>". nl2br( $columna['DESCRIPCION'])."</p>";
  41.  echo "<a href='galeria-fotografica.php?gal=$columna[IDGALERIA]'>VER GALERIA</a>";
  42.  echo '</div>';
  43.  }
  44.  echo '</div>';
  45.  
  46.  
  47.  
  48.    }

Que opinan?


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: MinusFour en 6 Abril 2016, 22:45 pm
Sigues con el error que te he estado mencionado hace 2 posts:

Código
  1. $columna = mysqli_fetch_assoc($filas);
  2. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";
  3.  
  4. }
  5. echo '<div id="listado">';
  6. $filas = mysqli_query($cnx, $consulta);
  7. while( $columna = mysqli_fetch_assoc($filas)){
  8.  
  9.  $id = $columna['IDGALERIA'];
  10.  
  11.  $datos = mysqli_fetch_assoc($filas);

No es necesario que hagas esto:

Código
  1. $columna = mysqli_fetch_assoc($filas);
  2. echo "<h1>Galerías $columna[NOMBRECATEGORIA]</h1>";

Al hacer esto, estás descartando una hilera de resultados completa solo para obtener el nombre de la categoría. Lo único que debes hacer es:

Código
  1. echo "<h1>Galerías $GET[cat]</h1>";

O simplemente:

Código
  1. echo "<h1>Galerías $id</h1>";


Título: Re: Problema con una consulta no funciona Distinct
Publicado por: Marciano_79 en 6 Abril 2016, 23:27 pm
No tengo palabras para agradecer toda la ayuda brindada por ti MinusFour (en especial por tu paciencia)  y a todos quienes de alguna forma se intereso en ayudarme, gracias porque al fin esta la galería como tanto la quería, llevo 5 meses aprendiendo con san google php, mysql y realmente me doy cuenta que este mundo de los códigos es toda una ciencia.. mis respetos a todos los que programan de verdad.. dejo el resultado final de como me funciona al 100% bien la galeria

Código
  1. if( isset( $_GET['cat'] ) ){  
  2.    $id = $_GET['cat'];
  3.        $consulta ="SELECT
  4.    categoria.IDCATEGORIA,
  5.            categoria.NOMBRE_CATEGORIA,
  6.            galerias.IDGALERIA,
  7.    galerias.TITULO,
  8.            DATE_FORMAT( galerias.FECHA_ALTA, '%d/%m/%Y' ) AS FECHA,
  9.            galerias.DESCRIPCION,
  10.            fotos.ARCHIVO
  11. FROM galerias
  12. INNER JOIN categoria ON categoria.IDCATEGORIA = galerias.FKCATEGORIA_ID
  13. LEFT JOIN
  14. (SELECT * FROM (
  15.   SELECT FKGALERIA,
  16.  ARCHIVO
  17.   FROM fotos
  18.   WHERE estado = 'visible'
  19.   ORDER BY RAND()
  20. ) AS tmp
  21. GROUP BY tmp.FKGALERIA) AS fotos
  22. ON galerias.IDGALERIA = fotos.FKGALERIA
  23. WHERE categoria.NOMBRE_CATEGORIA = '$id'";  
  24.  
  25.  
  26. echo "<h1>Galerías $id</h1>";
  27.     $filas = mysqli_query($cnx, $consulta);
  28. }
  29. echo '<div id="listado">';
  30.  
  31. while( $columna = mysqli_fetch_assoc($filas)){
  32.  
  33.  $id = $columna['IDGALERIA'];
  34.              $filas2 = mysqli_query($cnx, $consulta);
  35.  $datos = mysqli_fetch_assoc($filas2);
  36.  
  37.  $nombre_archivo = $datos['ARCHIVO'];
  38.  
  39.  echo '<div>';  
  40.  echo "<h2>$columna[TITULO]</h2>";
  41.  echo "<div>$columna[FECHA]</div>";
  42.  if( $nombre_archivo != null ){
  43.  echo "<img src='fotos/$nombre_archivo' alt='Preview de la galeria' />";
  44.  }
  45.  echo "<p>". nl2br( $columna['DESCRIPCION'])."</p>";
  46.  echo "<a href='galeria-fotografica.php?gal=$columna[IDGALERIA]'>VER GALERIA</a>";
  47.  echo '</div>';
  48.  }
  49.  echo '</div>';

Ahora estudiare sobre las inyecciones sql para la seguridad que me hablabas antes GRACIAS TOTALES.!