Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Resultados duplicados en MySQL

Estas en el tema de Resultados duplicados en MySQL en el foro de Mysql en Foros del Web. Mi consulta es la siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT DISTINCTROW phpbb_blog_posts.post_id , phpbb_blog_posts.post_approved , phpbb_blog_posts.post_title , phpbb_blog_posts.post_text , phpbb_blog_posts.post_imagen , phpbb_blog_tags.tag_id , ...
  #1 (permalink)  
Antiguo 30/05/2013, 18:27
Avatar de wowmatu  
Fecha de Ingreso: marzo-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Resultados duplicados en MySQL

Mi consulta es la siguiente:
Código MySQL:
Ver original
  1. SELECT DISTINCTROW phpbb_blog_posts.post_id,
  2. phpbb_blog_posts.post_approved,
  3. phpbb_blog_posts.post_title,
  4. phpbb_blog_posts.post_text,
  5. phpbb_blog_posts.post_imagen,
  6. phpbb_blog_tags.tag_id,
  7. phpbb_blog_tags.post_id,
  8. phpbb_blog_tags.tag_name
  9.  
  10. FROM phpbb_blog_posts,phpbb_blog_tags
  11.  
  12. WHERE post_approved ='1'
  13. ORDER BY phpbb_blog_posts.post_id

por lo cual me devuelve siempre:



intente utilizar el DISTINCTROW y el DISTINCT. pero sucede lo mismo... lo duplica como diez veces o mas a cada uno...



la tabla de los tags es asi

Última edición por wowmatu; 30/05/2013 a las 18:32
  #2 (permalink)  
Antiguo 31/05/2013, 12:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Resultados duplicados en MySQL

Hola wowmatu:

Tengo problemas para ver las imágenes que posteaste, pero de entrada lo que observo es que tienes un grave, pero grave problema.

En tu sección WHERE NO ESTÁS COLOCANDO NINGUNA RELACIÓN ENTRE TUS TABLAS por lo tanto se está realizando un PRODUCTO CARTESIANO. Observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows IN SET (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tablaB;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | one         |
  16. |    2 | two         |
  17. |    3 | three       |
  18. +------+-------------+
  19. 3 rows IN SET (0.00 sec)

Lo que tú estás haciendo es algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA, tablaB
  2.     -> WHERE tablaA.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. |    1 | uno         |    2 | two         |
  8. |    1 | uno         |    3 | three       |
  9. +------+-------------+------+-------------+
  10. 3 rows IN SET (0.00 sec)


Es decir, en el WHERE pones una condición, de que el id = 1, pero NO ESPECIFICAS COMO ESTÁN RELACIONADAS LAS DOS TABLAS... deberías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA
  2.     -> INNER JOIN tablaB ON TablaA.id = TablaB.id
  3.     -> WHERE tablaA.id = 1;
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | uno         |    1 | one         |
  8. +------+-------------+------+-------------+
  9. 1 row IN SET (0.00 sec)

Observa que en la sección ON especifico la relación que existe entre los campos, es decir, todos los campos que son comunes en ambas tablas.

Como comentario adicional, no hagas las uniones en el FROM-WHERE, en lugar de hacer esto:

Código:
...
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo
...
Has esto

Código:
...
FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
...
Si tienes dudas de cómo funciona el JOIN dale un vistazo a esta liga:

http://es.wikipedia.org/wiki/Join

Saludos
Leo.
  #3 (permalink)  
Antiguo 21/06/2013, 17:58
Avatar de wowmatu  
Fecha de Ingreso: marzo-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Resultados duplicados en MySQL

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola wowmatu:

Tengo problemas para ver las imágenes que posteaste, pero de entrada lo que observo es que tienes un grave, pero grave problema.

En tu sección WHERE NO ESTÁS COLOCANDO NINGUNA RELACIÓN ENTRE TUS TABLAS por lo tanto se está realizando un PRODUCTO CARTESIANO. Observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows IN SET (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tablaB;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | one         |
  16. |    2 | two         |
  17. |    3 | three       |
  18. +------+-------------+
  19. 3 rows IN SET (0.00 sec)

Lo que tú estás haciendo es algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA, tablaB
  2.     -> WHERE tablaA.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. |    1 | uno         |    2 | two         |
  8. |    1 | uno         |    3 | three       |
  9. +------+-------------+------+-------------+
  10. 3 rows IN SET (0.00 sec)


Es decir, en el WHERE pones una condición, de que el id = 1, pero NO ESPECIFICAS COMO ESTÁN RELACIONADAS LAS DOS TABLAS... deberías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA
  2.     -> INNER JOIN tablaB ON TablaA.id = TablaB.id
  3.     -> WHERE tablaA.id = 1;
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | uno         |    1 | one         |
  8. +------+-------------+------+-------------+
  9. 1 row IN SET (0.00 sec)

Observa que en la sección ON especifico la relación que existe entre los campos, es decir, todos los campos que son comunes en ambas tablas.

Como comentario adicional, no hagas las uniones en el FROM-WHERE, en lugar de hacer esto:

Código:
...
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo
...
Has esto

Código:
...
FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
...
Si tienes dudas de cómo funciona el JOIN dale un vistazo a esta liga:

[url]http://es.wikipedia.org/wiki/Join[/url]

Saludos
Leo.
me repite la misma noticia dependiendo cuantos tags contiene esa noticia...
  #4 (permalink)  
Antiguo 21/06/2013, 19:50
Avatar de 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: Resultados duplicados en MySQL

Cita:
Iniciado por wowmatu Ver Mensaje
me repite la misma noticia dependiendo cuantos tags contiene esa noticia...
Es que eso, en Bases de Datos, no se considera repetición.
Un registro se repite si y sólo si todos los valores de todos los campos son iguales, y en tu caso tienes un campo de tags que cambia de registro a registro.
DISTINCTROW, incluso, no tiene efecto precisamente por eso: diferencia registros de la tabla resultado diferentes, y en este caso siempre hay diferencias.
A lo máximo que puedes aspirar es que todos los tags se agrupen por cada post, para lo cual tienes que considerar dos cosas al menos:
1) Si existen o no posts sin tags (cosa que no has aclarado debidamente),
2) El tag_id se vuelve irrelvante en ese contexto, como tampoco necesitas traer de nuevo el post_id.
La cosa andaría por acá:
Código MySQL:
Ver original
  1.     bp.`post_id`,
  2.     bp.`post_approved`,
  3.     bp.`post_title`,
  4.     bp.`post_text`,
  5.     bp.`post_imagen`,
  6.     IFNULL(GROUP_CONCAT(pt.`tag_name`), '') tags
  7.     `phpbb_blog_posts` bp LEFT JOIN `phpbb_blog_tags` pt ON bp.post_id = pt.post_id
  8.     bp.`post_approved` = 1
  9. ORDER BY bp.`post_id` desc
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bases-de-datos-general, devuelve, duplicados, php, resultados, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:18.