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

Obtener registros que tengan 2 relaciones en la tabla relacional

Estas en el tema de Obtener registros que tengan 2 relaciones en la tabla relacional en el foro de Mysql en Foros del Web. Hola amigasos, me surgio este problema y no logro que funciones, tengo estas tablas: TABLA NOTICIAS id titulo contenido TABLA CATEGORIAS id nombre TABLA NOTICIAS_X_CATEGORIAS ...
  #1 (permalink)  
Antiguo 20/07/2013, 09:00
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Obtener registros que tengan 2 relaciones en la tabla relacional

Hola amigasos, me surgio este problema y no logro que funciones, tengo estas tablas:

TABLA NOTICIAS
id
titulo
contenido

TABLA CATEGORIAS
id
nombre

TABLA NOTICIAS_X_CATEGORIAS
idNoticia
idCategoria

Ovbiamente, una noticia puede estar en mas de una categoria.
Cuando necesito, obtener una noticia de X categoria, con un INNER JOIN, hago la consulta asi:
Código MySQL:
Ver original
  1. WHERE noticias_x_categorias.idCategoria = X

Lo que necesito ahora, es obtener una noticia, que esta en 2 categorias, intente esto pero no me devuelve nada:

Código MySQL:
Ver original
  1. WHERE noticias_x_categorias.idCategoria = X AND noticias_x_categorias.idCategoria = Y

Gracias por leer!

Última edición por gnzsoloyo; 20/07/2013 a las 09:50 Razón: Mal etiquetado.
  #2 (permalink)  
Antiguo 20/07/2013, 09: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, 4 meses
Puntos: 2658
Respuesta: Obtener registros que tengan 2 relaciones en la tabla relacional

Código MySQL:
Ver original
  1. SELECT N.id, N.titulo, N.contenido
  2. FROM NOTICIAS N INNER JOIN NOTICIAS_X_CATEGORIAS ON N.id = NC.idNoticia

Es algo que puedes encontrar en cualquier manual básico de SQL, sea de MySQL u otro DBMS cualquiera. La cláusula HAVING es un estándar, y el método es mas o menos universal.

Te agrego dos consejos, que se han repetido muchas veces en los foros de BBDD:
1) No uses nombres como "id", para los campos ed identificación, ponle un prefijo o sufijo que haga mucho más simple escribir las consultas, y facilita alas optimizaciones, evitando conflictos de campos ambiguos.
2) Nunca uses el WHERE para realizar la relación de los campos del JOIN. Usa el ON en el FROM. Es mucho más eficiente, menos proclive a generar errores de interpretación y por sobre todo, es optimizable por el parser, mientras que el WHERE no.
MySQL espera que en un INNER JOIN la relación se declare en el FROM, no en el WHERE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/07/2013, 11:59
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Obtener registros que tengan 2 relaciones en la tabla relacional

Gracias por responder, yo lo que hago siempre es con INNER JOIN unir las dos tablas y con el where, filtrar lo que necesito. Esta mal eso?

En tu respuesta no entiendo donde se indica que quiero las noticias de tal categoria.

Te pongo la query que uso siempre:
Código MySQL:
Ver original
  1.    contenidos.*
  2.    contenidos INNER JOIN contenido_x_categorias
  3.    ON contenido_x_categorias.idContenido = contenidos.id
  4. WHERE contenido_x_categorias.idCategoria = 1
  5. ORDER BY contenidos.fecha DESC


La consulta, funciona con las tablas "Contenidos", "Contenido_x_categorias" y "Categorias", que son iguales a las que describi mas arriba.

El problema que tengo es que esa consulta funciona perfecto, pero me trae todo el "contenido" de la categoria 1, por esto: WHERE contenido_x_categorias.idCategoria = 1
intente hacer algo asi WHERE contenido_x_categorias.idCategoria = 1 AND contenido_x_categorias.idCategoria = 2 y no me funciona.

Última edición por gnzsoloyo; 20/07/2013 a las 12:22
  #4 (permalink)  
Antiguo 20/07/2013, 12:30
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, 4 meses
Puntos: 2658
Respuesta: Obtener registros que tengan 2 relaciones en la tabla relacional

Cita:
WHERE contenido_x_categorias.idCategoria = 1 AND contenido_x_categorias.idCategoria = 2
Eso no te va a funcionar jamás, porque son condiciones contradictorias.
El WHERE se aplica a cada registro que se evalúa, y un mismo registro no puede tener dos valores diferentes para el mismo campo al mismo tiempo.
Además, en el contexto de lo que necesitas saber, como habrás notado, no se necesitan las tres tablas. Sólo dos (si agregas la tercera, a menos que quieras obtener el nombre de la categoría, no pone ni saca nada a la solución).
Lo que debe evaluarse es que:
1) Tenga más de una categoría.
2) Esas categorías sean 1 y 2.
Código MySQL:
Ver original
  1. SELECT N.id, N.titulo, N.contenido
  2. FROM NOTICIAS N INNER JOIN NOTICIAS_X_CATEGORIAS ON N.id = NC.idNoticia
  3. WHERE NC.idcategoria IN (1, 2)
  4. HAVING COUNT(*) = 2;

Ahora bien, si además quieres ordenarlas:
Código MySQL:
Ver original
  1. SELECT id, titulo, contenido
  2.     SELECT N.id, N.titulo, N.contenido, N.fecha
  3.     FROM contenido N INNER JOIN contenido_X_categorias ON N.id = NC.idNoticia
  4.     WHERE NC.idcategoria IN (1, 2)
  5.     GROUP BY N.id
  6.     HAVING COUNT(*) = 2) T
  7. ORDER BY N.fecha;
__________________
¿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: join, registros, relacional, relaciones, tabla
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 14:19.