Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/09/2011, 14:32
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: query para buscar varios tags de usuario

Hola carlosdanielmou:

No estoy seguro de si entendí correctamente cual es el problema, pero checa este script a ver si es más o menos lo que necesitas:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE usuario (uid INT, nombre VARCHAR(10));
  2. Query OK, 0 rows affected (0.11 sec)
  3.  
  4. mysql> INSERT INTO usuario VALUES (1, 'uno'), (2, 'dos'), (3, 'tres');
  5. Query OK, 3 rows affected (0.01 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> SELECT * FROM usuario;
  9. +------+--------+
  10. | uid  | nombre |
  11. +------+--------+
  12. |    1 | uno    |
  13. |    2 | dos    |
  14. |    3 | tres   |
  15. +------+--------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> CREATE TABLE tags (tid INT, nombre VARCHAR(10));
  19. Query OK, 0 rows affected (0.08 sec)
  20.  
  21. mysql> INSERT INTO tags VALUES (1, 'autos'), (2, 'usados'), (3, 'nuevos');
  22. Query OK, 3 rows affected (0.03 sec)
  23. Records: 3  Duplicates: 0  Warnings: 0
  24.  
  25. mysql> SELECT * FROM tags;
  26. +------+--------+
  27. | tid  | nombre |
  28. +------+--------+
  29. |    1 | autos  |
  30. |    2 | usados |
  31. |    3 | nuevos |
  32. +------+--------+
  33. 3 rows in set (0.00 sec)
  34.  
  35. mysql> CREATE TABLE usuario_tags (usuario_id INT, tags_id INT);
  36. Query OK, 0 rows affected (0.08 sec)
  37.  
  38. mysql> INSERT INTO usuario_tags VALUES (1, 1), (1, 2), (1, 3), (2, 2),
  39.     -> (2, 3), (3, 1), (3, 2);
  40. Query OK, 7 rows affected (0.05 sec)
  41. Records: 7  Duplicates: 0  Warnings: 0
  42.  
  43. mysql> SELECT * FROM usuario_tags;
  44. +------------+---------+
  45. | usuario_id | tags_id |
  46. +------------+---------+
  47. |          1 |       1 |
  48. |          1 |       2 |
  49. |          1 |       3 |
  50. |          2 |       2 |
  51. |          2 |       3 |
  52. |          3 |       1 |
  53. |          3 |       2 |
  54. +------------+---------+
  55. 7 rows in set (0.00 sec)
  56.  
  57. mysql> SELECT T1.* FROM usuario T1 INNER JOIN
  58.     -> (SELECT usuario_id FROM usuario_tags
  59.     -> WHERE tags_id IN (1, 2) GROUP BY usuario_id
  60.     -> HAVING COUNT(usuario_id) = 2
  61.     -> ) T2 ON T1.uid = T2.usuario_id;
  62. +------+--------+
  63. | uid  | nombre |
  64. +------+--------+
  65. |    1 | uno    |
  66. |    3 | tres   |
  67. +------+--------+
  68. 2 rows in set (0.00 sec)

Todo el problema se resuelve en el select interno marcado como T2. Para el ejemplo estoy buscando aquellos usuarios que tengan los tags 1 y 2.

Código:
tags_id IN (1, 2)
El truco está en agrupar por usuario_id y preguntar por aquellos que tengan un HAVING COUNT = 2

Código:
GROUP BY usuario_id HAVING COUNT(usuario_id) = 2
para el caso del usuario 2, su COUNT sería de 1 (pues sólo tiene el tag 2), por lo tanto no entra dentro del filtrado.

Dale un vistazo para ver si es lo que necesitas, y si continuas con problemas pon algunos datos de ejemplo en tus tablas, para poder tratar de ayudarte.

Saludos
Leo.