Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/05/2013, 08:59
leonardo_josue
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.