Ver Mensaje Individual
  #6 (permalink)  
Antiguo 02/07/2012, 14:23
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: like con subquery

Hola de nuevo.

Por como describes el problema, creo que quiere mostrar una especie de lista de cosas que cierto grupo de personas tienen en común a partir de los objetos tienes como propiedad cierto??? veamos si esto es más o menos lo que buscas, supongamos que tenemos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM coche;
  2. +------+-------------------+
  3. | id   | nombre            |
  4. +------+-------------------+
  5. |    1 | Toyota Auris      |
  6. |    2 | Ford Fiesta       |
  7. |    3 | Nuevo Ford Fiesta |
  8. |    4 | Toyota            |
  9. +------+-------------------+
  10. 4 rows in set (0.08 sec)
  11.  
  12. mysql> SELECT * FROM persona;
  13. +------+--------+
  14. | id   | nombre |
  15. +------+--------+
  16. |    1 | DöH    |
  17. |    2 | Leo    |
  18. |    3 | Otro   |
  19. +------+--------+
  20. 3 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT * FROM propiedad;
  23. +------+-------+---------+
  24. | id   | coche | persona |
  25. +------+-------+---------+
  26. |    1 |     1 |       1 |
  27. |    2 |     1 |       2 |
  28. |    3 |     2 |       1 |
  29. |    4 |     2 |       2 |
  30. |    5 |     3 |       1 |
  31. |    6 |     4 |       3 |
  32. +------+-------+---------+
  33. 6 rows in set (0.00 sec)

Si el parámetro de búsqueda fuera la persona 2 (Leo) podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   persona.id, persona.nombre,
  3.     ->   coche.id, coche.nombre
  4.     -> FROM coche
  5.     -> INNER JOIN
  6.     ->   ( SELECT coche.nombre coche
  7.     ->     FROM propiedad
  8.     ->     INNER JOIN coche ON propiedad.coche = coche.id
  9.     ->     WHERE propiedad.persona = 2
  10.     ->   ) A ON ( coche.nombre LIKE CONCAT('%', A.coche, '%') OR
  11.     ->            A.coche LIKE CONCAT('%', coche.nombre, '%')
  12.     ->          )
  13.     ->          AND coche.nombre != A.coche
  14.     -> INNER JOIN propiedad ON propiedad.coche = coche.id
  15.     -> INNER JOIN persona ON propiedad.persona = persona.id;
  16. +------+--------+------+-------------------+
  17. | id   | nombre | id   | nombre            |
  18. +------+--------+------+-------------------+
  19. |    1 | DöH    |    3 | Nuevo Ford Fiesta |
  20. |    3 | Otro   |    4 | Toyota            |
  21. +------+--------+------+-------------------+
  22. 2 rows in set (0.00 sec)

El usuari 1 (DöH) aparece en el listado porque tiene tiene un Nuevo Ford Fiesta que su descripción es similar a Ford Fiesta... el usuario 3 (otro) aparece pues tiene un Toyota, que su descripción es similar a Toyota Auris y

Falta un pequeño detalle con respecto a lo lo que planteas en tu problema original, y es el hecho de que en realidad el usuario 3 (Otro) NO COMPARTE NINGUNA COCHE EN COMUN con el usuario 2... faltaría agregar una condición WHERE donde especifiques que EXISTA esta relación (y si no te queda claro te digo que necesitas hacer un EXISTS...), me gustaría que lo intentaras sacar por tu cuenta...

Observa que la condición LIKE la hago de de dos formas:

Código:
( coche.nombre LIKE CONCAT('%', A.coche, '%') OR
  A.coche LIKE CONCAT('%', coche.nombre, '%')
)
Esto es necesario porque:

Código MySQL:
Ver original
  1. mysql> select 'Ford Fiesta' LIKE '%Nuevo Ford Fiesta%';
  2. +------------------------------------------+
  3. | 'Ford Fiesta' LIKE '%Nuevo Ford Fiesta%' |
  4. +------------------------------------------+
  5. |                                        0 |
  6. +------------------------------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> SELECT 'Nuevo Ford Fiesta' LIKE '%Ford Fiesta%';
  10. +------------------------------------------+
  11. | 'Nuevo Ford Fiesta' LIKE '%Ford Fiesta%' |
  12. +------------------------------------------+
  13. |                                        1 |
  14. +------------------------------------------+
  15. 1 row in set (0.00 sec)

Dale un vistazo para ver si te sirve...

Saludos