Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/10/2013, 10:43
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: Detectar @menciones en una consulta sql

Hola 50l3r:

Hace algún tiempo otro forista comentaba algo muy similar a lo que estás planteando... el problema corresponde más buen a un error de diseño de tus tablas... no es correcto guardes TEXTOS como lo que haces, si no lo que tienes que hacer es guardar ACCIONES asociadas a los usuarios... es decir, en lugar de tener una tabla así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------------------------------------------+
  3. | id   | comentario                                  |
  4. +------+---------------------------------------------+
  5. |    1 | A @john le ha gustado #juego_de_tronos      |
  6. |    2 | A @john_ande le ha gustado #juego_de_tronos |
  7. |    3 | @john a comentado algo                      |
  8. |    4 | @john_ande a comentado algo                 |
  9. |    5 | @leo es amigo de @john                      |
  10. |    6 | @leo es amigo de @john_ande                 |
  11. |    7 | @john                                       |
  12. |    8 | @john_ande                                  |
  13. +------+---------------------------------------------+
  14. 8 rows in set (0.00 sec)

deberías tener un modelo con al menos tres tablas:

Código MySQL:
Ver original
  1. usuarios
  2. idUsuario|nombreUsuario
  3. 1|@john
  4. 2|@john_ande
  5.  
  6. Acciones
  7. 1|Me gusta
  8. 2|Comentario
  9. 3|otra
  10.  
  11. AccionesUsuario
  12. idAccionUsuario|idAccion|idUsuario
  13. 1|1|1
  14. 2|1|2
  15. 3|2|1
  16. 4|2|2
  17. 5|3|1
  18. 6|3|2

De esta evitas el uso de consultas tipo LIKE, las cuales por cierto SON TERRIBLEMENTE INEFICIENTES, lo cual puede comprometer el rendimiento del servidor.

Ahora bien, esto es por el lado del modelo de BD, sin embargo, SI TE ES IMPOSIBLE CAMBIAR TU MODELO, entonces la consulta se vuelve un poco más compleja. De entrara, permitir que se pueda capturar CUALQUIER cosa en un campo tipo TEXTO, el usuario a buscar puede aparecer al menos en 4 formas distintas (como en la tabla que pongo de ejemplo), es decir sólo, al inicio de la frase, en medio de la frase o al final de la frase... suponiendo que el separador siempre sea el espacio en blanco, podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------------------------------------------+
  3. | id   | comentario                                  |
  4. +------+---------------------------------------------+
  5. |    1 | A @john le ha gustado #juego_de_tronos      |
  6. |    2 | A @john_ande le ha gustado #juego_de_tronos |
  7. |    3 | @john a comentado algo                      |
  8. |    4 | @john_ande a comentado algo                 |
  9. |    5 | @leo es amigo de @john                      |
  10. |    6 | @leo es amigo de @john_ande                 |
  11. |    7 | @john                                       |
  12. |    8 | @john_ande                                  |
  13. +------+---------------------------------------------+
  14. 8 rows in set (0.00 sec)
  15.  
  16. mysql> SELECT * FROM tabla
  17.     -> WHERE
  18.     ->    comentario = '@john' OR
  19.     ->    comentario LIKE '@john %' OR
  20.     ->    comentario LIKE '% @john %' OR
  21.     ->    comentario LIKE '% @john';
  22. +------+----------------------------------------+
  23. | id   | comentario                             |
  24. +------+----------------------------------------+
  25. |    1 | A @john le ha gustado #juego_de_tronos |
  26. |    3 | @john a comentado algo                 |
  27. |    5 | @leo es amigo de @john                 |
  28. |    7 | @john                                  |
  29. +------+----------------------------------------+
  30. 4 rows in set (0.00 sec)

Lo cual es terrible

esto se complica aun más si el separador no es solo el espacio en blanco, y pudieras tener cosas como:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE id > 8;
  2. +------+---------------------------------------+
  3. | id   | comentario                            |
  4. +------+---------------------------------------+
  5. |    9 | A @john, @john_ande y @leo son amigos |
  6. |   10 | A @john-@john_ande-@leo son amigos    |
  7. |   11 | A @john|@john_ande|@leo son amigos    |
  8. +------+---------------------------------------+
  9. 3 rows in set (0.00 sec)

Es decir utilizar un separador distinto al espacio, o permitir valores multivariados...


Insisto, si puedes cambiar tu modelo de BD, HAZLO y evitate dolores de cabeza.

Saludos
Leo.