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

Como hacer que el buscador no repita los registros

Estas en el tema de Como hacer que el buscador no repita los registros en el foro de Mysql en Foros del Web. Buenas noches, Tengo un buscador en php y estoy haciendo ésta selección. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original //busca en una base de datos hecha ...
  #1 (permalink)  
Antiguo 28/06/2011, 19:12
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Pregunta Como hacer que el buscador no repita los registros

Buenas noches,

Tengo un buscador en php y estoy haciendo ésta selección.

Código PHP:
Ver original
  1. //busca en una base de datos hecha en mysql con campos distribuidor, marca, producto, comentario, pero recuerda que puedes cambiarlos
  2. $campo = array("mo_titulo", "mo_subtitulo", "mo_descripcion");
  3. //aqui ponemos los campos de la tabla en que queremos buscar
  4. $numelentos = count($campo);//toma el numero de campos y lo guarda para usarla despues
  5. $bandera = "si";//bandera para indicar si se encontro la palabra
  6. for ($i=0; $i < $numelentos; $i++)
  7. //realizaremos el recorrido de busqueda en cada campo que seleccionamos de nuestra tabla
  8. {// inicio for
  9. $campoac= $campo[$i];//guardamos el campo actual
  10.  
  11. $a= $_POST['palabra'];//Guardamos la palabra que se buscara
  12.  
  13. if ($a==false)// si no se ingreso una palabra nos avisa
  14.  {
  15.   echo "<script language=javascript>
  16.     alert('Debe especificar la busqueda')
  17.     </script>";
  18.   echo "</html></body> \n";
  19.   exit;
  20.  }
  21.  
  22. $link = mysql_connect("", "", "");
  23. //si se ingreso la palabra nos conectamos
  24. mysql_select_db("", $link);
  25. //que busque en el campo actual la palabra enviada y lo ordene por un campo especifica
  26. $sql = "SELECT * FROM t_modelos WHERE $campoac LIKE '%{$_POST['palabra']}%' GROUP BY  $campoac ORDER BY RAND()";
  27. $result = mysql_query($sql, $link);

pero me arroja dos resultados por ejm si coloco "A" y este lee que en el título y en la descripción existen entonces lo arroja dos veces desde la base de datos.

Si coloco en el buscador por ejm:

Casa

Y el artículo tiene de titulo CASA y en la descripcion "Una CASA bella" entonces me aparece dos veces el resultado


¿Cómo debe ser el SELECT para que esto no suceda?

Gracias!
  #2 (permalink)  
Antiguo 29/06/2011, 03:06
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Como hacer que el buscador no repita los registros

Con un GROUP BY
  #3 (permalink)  
Antiguo 29/06/2011, 05:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

Esta es tu consulta:
Código MySQL:
Ver original
  1. FROM t_modelos
  2. WHERE $campoac LIKE '%{$_POST['palabra']}%' GROUP BY  $campoac ORDER BY RAND()
La consulta en sí misma debería devolver un sólo registro por coincidencia global, es decir, sin importar cuántas veces aparezca en el campo, con una sola coincidencia aparecerá un sólo y único registro.
El problema potencial es que en realidad no estás preguntando por un campo constante, sino que el mismo se indica dinámicamente al crear la sentencia en el PHP. Por lo que dices, infiero que debes estar consultando dos veces la tabla, una vez para comparar contra el título y otra vez por la descripción. Allí está el problema, porque en realidad en PHP estarías combinando el resultado de dos consultas diferentes, cada una de las cuales da el resultado correctamente por si misma, pero no estás verificando al tomar el resultado de la segunda consulta que no estén llegando registros que ya existan en la primera.
Eso es un error de programación, y no de consulta.
Tienes dos formas de resolver la cosa:
- En PHP, lo más simple es que cuando vayas barriendo los registros obtenidos, antes de incorporarlos a la tabla verifiques que el ID del registro que entra no exista ya entre los que se recibieron. Tan simple como eso. ¿Cómo se hace? Eso es tema del Foro de PHP.
- A nivel de MySQL la única forma de comparar un valor dado contra más de un campo al mismo tiempo y sin hacer cosas complicadas, es trabajar con índices FULLTEXT (sólo con tablas MyISAM), donde el índice se defina por todos los campos donde se hará la búsqueda. Es muy eficiente, pero tiene una limitación: Sólo puedes usarlo para buscar palabras completas y no palabras parciales.

Una tercera posibilidad sería crear una sentencia múltiple usando UNION, o bien con un OR condición por cada campo usado, pero eso es un poco más complicado y requiere una programación PHP muy bien hecha.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/06/2011, 08:17
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Como hacer que el buscador no repita los registros

gnzsoloyo

Entiendo lo que dices y si creo que es por la cualidad de la busqueda, que pasa por dos lugares donde posee la misma información y por ende arrojará dos resultados, pero como puedo evitar eso!?

Cómo concateno el SELECT quizás si uno las tablas o como hago para que pueda hacer la busqueda por toda la información del registro sin repetirlo.
  #5 (permalink)  
Antiguo 30/06/2011, 08:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

Algo tan simple como:
Código MySQL:
Ver original
  1. FROM t_modelos
  2. WHERE $campo LIKE '%palabra%'
  3. FROM t_modelos
  4. WHERE $campo LIKE '%palabra%'
Lo que debes crear a través de PHP es una serie de SELECT con la clausula UNION intercalada, y sólo al final poner el ORDER BY.
UNION devuelve los resultados de cada consulta agregados a la de las otras, pero elimina todos los duplicados.
El ORDER BY sólo puede ir al final, en la última consulta, porque todo el conjunto es una única consulta, y no puede haber dos ORDER BY en una misma consulta. Tampoco puede haber dos GROUP BY ni LIMIT. En todos estos casos se deben poner una sola vez y al final.
Como esto se creará por PHP, la codificación del bloque es algo complicada. Para eso te sugiero que consultes en el Foro de PHP, donde te pueden guiar mejor (yo lo hago, pero en VB.Net).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 30/06/2011, 12:05
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Como hacer que el buscador no repita los registros

Me recomiendas que haga la busqueda por cuantos campos? descripcion únicamente? por que como sigue leyendo el nombre y la descripcion con un mismo término sigue generando 2 registros.

Si pudiera colocar que al leer ambos registros se de cuenta que es el mismo ID y los una en un solo registro sería ideal.
  #7 (permalink)  
Antiguo 30/06/2011, 12:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

Cita:
Me recomiendas que haga la busqueda por cuantos campos? descripcion únicamente? por que como sigue leyendo el nombre y la descripcion con un mismo término sigue generando 2 registros.
Por creación dinámica de consulta se entiende que el programador crea las consultas por medio de codificación en el lenguaje. Esto significa que no te estoy diciendo ninguna cantidad, porque eso lo tienes que definir tu.
Yo no te voy a a consejar ninguna cosa sin conocer el relevamiento del sistema que diseñas, los procesos implicados, las reglas del negocio (como mínimo) y el diseño que plasmaste de la base. Hacerlo sería inferir más allá de lo que me estás dando.

Cita:
Si pudiera colocar que al leer ambos registros se de cuenta que es el mismo ID y los una en un solo registro sería ideal.
Disculpa, pero eso no tiene ningún sentido.
Si tienes dos registros iguales, con los mismos datos, ¿para qué quieres mostrarlos uno al lado de otro? ¿Qué utilidad tendría?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 30/06/2011, 12:30
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Pregunta Respuesta: Como hacer que el buscador no repita los registros

"Disculpa, pero eso no tiene ningún sentido.
Si tienes dos registros iguales, con los mismos datos, ¿para qué quieres mostrarlos uno al lado de otro? ¿Qué utilidad tendría?"


No no! creo que me planteo mal. La verdad es esta, por ejm:

Yo tengo un solo modelo cargado.

Pero el titulo es:

Hola

Descripcion:

Hola como estas?


Al poner en el buscador la palabra hola, me sale dos veces por que lo leyo dos veces el buscador dentro del registro. Quiero es evitar eso! o probablemente que la consulta se de cuenta que es el mismo ID y solo muestre uno.
  #9 (permalink)  
Antiguo 30/06/2011, 13:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

Me paece que no estás entendiendo cómo funciona el SQL...
Todo eso debería desaparecer desde el mismo momento en que usas el UNION. Si usas un "SELECT *...", tus consulta devuelven siempre el registro completo. ¿No es así?
Bueno, con consultas donde se usa el UNION (siempre que el orden y cantidad de registros sean siempre los mismos en cada SELECT), lo que hace MySQL es comparar los contenidos de todos los campos, y si encuentra que hay duplicados, los descarta. Simplemente el SELECT no los devolverá, el que un registro provenga de la comparación de un campo y el otro de otra comparación distinta, es absolutamente irrelevante para el caso. De todos modos eliminará el duplicado.
Ahora bien, lo que hagas luego con la tabla que esa consulta te devuelve, es asunto de programación, no de MySQL. No hay forma desde el MySQL de verificar si tu mismo vas a poner dos veces el mismo registro cuando lo analices con PHP.
¿Se entiende? PHP no es MySQL.

Resumiendo: Con UNION, MySQL no te devolverá registros duplicados. Si luego los duplicas tu en pantalla, no es asunto de la base de datos. Es tuyo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/06/2011 a las 13:48
  #10 (permalink)  
Antiguo 30/06/2011, 13:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

Veamosló en un ejemplo:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS `test`.`tabla`;
  2. Query OK, 0 rows affected, 1 warning (0.02 sec)
  3.  
  4. mysql> CREATE TABLE  `test`.`tabla` (
  5.     ->   `campo1` varchar(100) default NULL,
  6.     ->   `campo2` varchar(100) default NULL
  7.     -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  8. Query OK, 0 rows affected (0.06 sec)
  9.  
  10. mysql> INSERT INTO tabla
  11.     -> VALUES
  12.     ->   ('Hola',''),
  13.     ->   ('Hola','¿Hola como estas?'),
  14.     ->   ('','¿Hola como estas?'),
  15.     ->   ('','¿Hola como estas?'),
  16.     ->   ('Hola',''),
  17.     ->   ('Hola',''),
  18.     ->   ('Hola','');
  19. Query OK, 7 rows affected (0.05 sec)
  20. Records: 7  Duplicates: 0  Warnings: 0
  21.  
  22. mysql> SELECT *
  23.     -> FROM tabla
  24.     -> WHERE campo1 LIKE '%Hola%';
  25. +--------+-------------------+
  26. | campo1 | campo2            |
  27. +--------+-------------------+
  28. | Hola   |                   |
  29. | Hola   | ¿Hola como estas? |
  30. | Hola   |                   |
  31. | Hola   |                   |
  32. | Hola   |                   |
  33. +--------+-------------------+
  34. 5 rows in set (0.00 sec)
  35.  
  36. mysql> SELECT *
  37.     -> FROM tabla
  38.     -> WHERE campo2 LIKE '%Hola%';
  39. +--------+-------------------+
  40. | campo1 | campo2            |
  41. +--------+-------------------+
  42. | Hola   | ¿Hola como estas? |
  43. |        | ¿Hola como estas? |
  44. |        | ¿Hola como estas? |
  45. +--------+-------------------+
  46. 3 rows in set (0.00 sec)
  47.  
  48. mysql> SELECT *
  49.     -> FROM tabla
  50.     -> WHERE campo1 LIKE '%Hola%'
  51.     -> UNION
  52.     -> SELECT *
  53.     -> FROM tabla
  54.     -> WHERE campo2 LIKE '%Hola%';
  55. +--------+-------------------+
  56. | campo1 | campo2            |
  57. +--------+-------------------+
  58. | Hola   |                   |
  59. | Hola   | ¿Hola como estas? |
  60. |        | ¿Hola como estas? |
  61. +--------+-------------------+
  62. 3 rows in set (0.00 sec)
¿Se entiende?
A pesar de os resultados de las consultas únicas, no hay en la última dos registros que estén repetidos. No al menos en el sentido estricto de repetir el registro completo, porque ese es el sentido del registro duplicado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 30/06/2011, 14:06
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Como hacer que el buscador no repita los registros

Entiendo!

Entonces probablemente sea por los ARRAY?

Fíjate en esto

Código PHP:
Ver original
  1. //busca en una base de datos hecha en mysql con campos distribuidor, marca, producto, comentario, pero recuerda que puedes cambiarlos
  2. $campo = array("mo_titulo", "mo_subtitulo", "mo_descripcion", "mo_caracteristicas");
  3. //aqui ponemos los campos de la tabla en que queremos buscar
  4. $numelentos = count($campo);//toma el numero de campos y lo guarda para usarla despues
  5. $bandera = "si";//bandera para indicar si se encontro la palabra
  6. for ($i=0; $i < $numelentos; $i++)
  7. //realizaremos el recorrido de busqueda en cada campo que seleccionamos de nuestra tabla
  8. {// inicio for
  9. $campoac= $campo[$i];//guardamos el campo actual
  10.  
  11. $a= $_POST['palabra'];//Guardamos la palabra que se buscara
  12.  
  13. if ($a==false)// si no se ingreso una palabra nos avisa
  14.  {
  15.   echo "<script language=javascript>
  16.     alert('Debe especificar la busqueda')
  17.     </script>";
  18.   echo "</html></body> \n";
  19.   exit;
  20.  }
  21.  
  22. $link = mysql_connect("", "", "");
  23. //si se ingreso la palabra nos conectamos
  24. mysql_select_db("", $link);
  25. //que busque en el campo actual la palabra enviada y lo ordene por un campo especifica
  26. $sql = "SELECT * FROM t_modelos WHERE $campoac LIKE '%{$_POST['palabra']}%' UNION SELECT * FROM t_modelos WHERE $campoac LIKE '%{$_POST['palabra']}%' ORDER BY RAND()";

La función $campoac posee a $campo que hace la búsqueda por las columnas de la tabla en MYSQL, lo que debo hacer es quitar el ARRAY y fijar con UNION que pase por cada una de las columnas que yo decida? es correcto?
  #12 (permalink)  
Antiguo 30/06/2011, 15:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como hacer que el buscador no repita los registros

PHP no es tema de este foro. Pregunta los detalles de manejo de Arrays en el Foro de PHP.
Allí te responderán mejor y más rápido, porque allí están los expertos en ese lenguaje. Acá la cosa es SQL, Bases de Datos y MySQL.

Lo que sí te puedo decir es que:
1) Los Array no existen en MySQL. Existen en otros DBMS pero no en MySQL
2) Tienes que armar un SELECT por cada una de las opciones que pones en el Array,en lo que respecta a nombres de campos.
3) Diferentes componentes de una condición WHERE no se separan por comas sino por operadores lógicos (AND, OR, XOR, NOT).
4) Poner un nombre de columna sin su correspondiente comparación equivale a preguntar si es o no TRUE (si no está vacía es TRUE).
5) Si pones varios campos sin compararlos y separados por comas te dará un error de sitaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 30/06/2011, 18:21
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Como hacer que el buscador no repita los registros

Entiendo!!! muchas gracias, preguntaré en el foro de PHP entonces!! MUCHAS GRACIAS! de hecho ahora que lo veo así, podrías ayudarme con esta también?

http://www.forosdelweb.com/f18/mostrar-registros-concatenados-925653/#post3912006

Ingresa y te darás cuenta el detalle, quizás es sencillo solo que no logro saber el punto clave.

SLDS, y Muchas gracias nuevamente gnzsoloyo!

Etiquetas: registros, buscadores
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 00:12.