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

[SOLUCIONADO] Buscar en tabla relacional discriminando la aparición

Estas en el tema de Buscar en tabla relacional discriminando la aparición en el foro de Bases de Datos General en Foros del Web. No sé si he puesto el título bien porque no se cómo explicarme... pero la cuestión es que tengo una tabla con una serie de ...
  #1 (permalink)  
Antiguo 07/05/2013, 07:08
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 20 años, 6 meses
Puntos: 2
Buscar en tabla relacional discriminando la aparición

No sé si he puesto el título bien porque no se cómo explicarme... pero la cuestión es que tengo una tabla con una serie de artículos, a estos artículos le puedes aplicar una o varias categorías. Esta relación la meto en una tercera tabla donde tengo el id_categoria y el id_item.

Dicho esto, mi intención es hacer una selección de artículos que tenganuna categoría, pero que a su vez no tengan una segunda...

Tabla artículos
Código:
id, titulo, contenido
--------------------------------------------
1, Articulo 1, Contenido 1
2, Articulo 2, Contenido 2
3, Articulo 3, Contenido 3
Tabla categorias
Código:
id, titulo
--------------------------------------------
1, Categoria 1
2, Categoria 2
3, Categoria 3
Tabla items_categorias
Código:
id, id_categoria, id_item
--------------------------------------------
1, 1, 1
2, 2, 1
3, 3, 1
4, 1, 2
4, 2, 2
4, 1, 3
4, 3, 3
Entonces quiero sacar los id de los artículos que tengan la id_categoría = 1 pero NO si tiene el id_categoria=2... con lo que el resultado sería el artículo con id=3

¿Me podéis echar una mano?
Gracias!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #2 (permalink)  
Antiguo 07/05/2013, 08:59
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Buscar en tabla relacional discriminando la aparición

Hola X3mdesign:

No me queda claro, pero supongo que en tu tabla items_categorias el campo id_item es tu llave foránea hacia tu tabla Artículos... mucho ojo con eso, veo que en tus tres tablas manejas el mismo atributo id, esto no es una buena práctica... es preferible que en tu tabla Artículos pongas tu campo llave como id_item, lo mismo en tu tabla categorías... en lugar de dejar el campo como id podrías dejarlo como id_categoría, de esta manera las relaciones quedan con la misma referencia, pero bueno, eso es solo una buena práctica de SQL...

Con respecto a tu problema, en realidad tienes varias formas para llegar al mismo resultado, podrías utilizar NOT IN o NOT EXISTS para filtrar los datos que quieres... sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM items_categorias;
  2. +------+--------------+---------+
  3. | id   | id_categoria | id_item |
  4. +------+--------------+---------+
  5. |    1 |            1 |       1 |
  6. |    2 |            2 |       1 |
  7. |    3 |            3 |       1 |
  8. |    4 |            1 |       2 |
  9. |    4 |            2 |       2 |
  10. |    4 |            1 |       3 |
  11. |    4 |            3 |       3 |
  12. +------+--------------+---------+
  13. 7 rows in set (0.00 sec)
  14.  
  15. mysql> SELECT I1.id_item
  16.     -> FROM items_categorias I1
  17.     -> WHERE I1.id_categoria = 1 AND
  18.     ->       NOT EXISTS ( SELECT id_item
  19.     ->                    FROM items_categorias I2
  20.     ->                    WHERE I1.id_item = I2.id_item AND
  21.     ->                          I2.id_categoria = 2 );
  22. +---------+
  23. | id_item |
  24. +---------+
  25. |       3 |
  26. +---------+
  27. 1 row in set (0.00 sec)
  28.  
  29. mysql> SELECT I1.id_item
  30.     -> FROM items_categorias I1
  31.     -> WHERE I1.id_categoria = 1 AND id_item
  32.     ->       NOT IN ( SELECT id_item
  33.     ->                    FROM items_categorias I2
  34.     ->                    WHERE I2.id_categoria = 2 );
  35. +---------+
  36. | id_item |
  37. +---------+
  38. |       3 |
  39. +---------+
  40. 1 row in set (0.00 sec)

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 07/05/2013, 10:10
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 20 años, 6 meses
Puntos: 2
Respuesta: Buscar en tabla relacional discriminando la aparición

Hola leonardo_josue, gracias por tan pronta respuesta ;)

Con el primer método ha funcionado perfecto, y gracias por el consejo de los IDs, la verdad es que llevo trabajando así desde los inicios... y estoy ya acostumbrado pero lo tendré en cuenta ;)
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour

Etiquetas: relacional, 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 19:38.