Foros del Web » Programando para Internet » PHP »

Búsqueda

Estas en el tema de Búsqueda en el foro de PHP en Foros del Web. Hola... Tengo una base de datos, donde uno de los campos es tipo text y me guarda información para búsqueda asi palabra1 / palabra2 / ...
  #1 (permalink)  
Antiguo 07/03/2005, 14:49
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
Búsqueda

Hola...

Tengo una base de datos, donde uno de los campos es tipo text y me guarda información para búsqueda asi

palabra1 / palabra2 / palabra3 / palabra4 / palabra5 / palabra6

no tengo muy claro si esas son mis palabras claves para búsqueda, el como debo realizar el select...


aahh esas palabras claves me llegan asi separadas por '/'

Última edición por Salome; 07/03/2005 a las 15:06
  #2 (permalink)  
Antiguo 07/03/2005, 18:09
Avatar de txetxol  
Fecha de Ingreso: febrero-2002
Ubicación: Pamplona
Mensajes: 73
Antigüedad: 15 años, 9 meses
Puntos: 1
mm y esas palabras se repiten? en ese caso sería una relación N:N.

Por que no creas una tabla que contenga un la palabra sola y un código, y relacionas los datos con las palabras mediante una tabla intermedia, que contenga el cod de la palabra y el cod de origen.

un saludo
  #3 (permalink)  
Antiguo 08/03/2005, 05:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si dices que tienes un campo en tu BD (uno sólo) que guardas esas "palabras clave" .. la busqueda la tendrás que hacer en ese campo .. no vas a poder "normalizar" nada y el rendimiento en las busquedas no va a ser lo más óptimo.

Como tu campo al fin y al cabo es una "frase" (da igual así si tienes separados tus palabras por un / un espacio .. etc .. ) tendrías que usar "LIKE" .. pues dicho comando SQL busca en una cadena coincidencias de tu string a buscar:

SELECT * FROM tabla WHERE ese_campo_que_mencinas LIKE '%$termino_a_buscar%'

Esta sentencia SQL no es del todo "buena" .. en tal caso consulta en el foro de Base de datos por una menjor sentencia SQL.

También puedes usar campos en busqueda "Full text search" (busqueda de texto completo) .. (no sé si podrás alterar el tipo de campo que usas en tu BD..?). Tienes un manal al respecto:

http://www.mysql-hispano.org/page.php?id=15

Un saludo,
  #4 (permalink)  
Antiguo 08/03/2005, 07:22
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
No solo busco en ese campo.. ese es solo un campo de palabras claves... el desarrollo es una biblioteca, para realizar reserva de material e inventarios...

entonces también se realizan busquedas por titulo, autor, idioma, categoria, tipo(electrónico o físico).. entre otros..

asi que entonces puedo usar el palabras claves con LIKE como cadena o string.. y el resto? como podria hacer.. tambien con like.. ?? Pues el usuario tiene la posiblidad de usar varios parámetros de busqueda, titulo, autor, idioma, categoria, tipo, palabras claves...
  #5 (permalink)  
Antiguo 08/03/2005, 08:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues el resto .. operadores lógicos AND u OR .. y más grupos de campo LIKE '%$termino_a_buscar% ...

Sobre todo recuerda que para PHP .. tus sentencias SQL tan sólo son más strings (cadenas) .. así que en determinados casos es probable que requieras componer tu "SQL" en función de lo que tengas ..

Por ejemplo .. no sé si vas a permitir la busqueda en vários campos simultáneamente o bien excluyentes (sólo seleccionar un campo donde buscar) .. En ese caso ..tendrás que hacerte tus if() (condicionales o switch()) para ir componiendo tu SQL para el "WHERE"..

swithc
  #6 (permalink)  
Antiguo 08/03/2005, 08:10
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
okas.. gracias.. La idea es dejar hacer búsqueda por varios campos...

Última edición por Salome; 08/03/2005 a las 08:12
  #7 (permalink)  
Antiguo 08/03/2005, 08:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Salome
okas.. gracias.. La idea es dejar hacer búsqueda por varios campos...
Ok, .. el $termino_a_buscar .. es el mismo ..

SELECT * FROM tabla WHERE campo1 LIKE '%$termino_a_buscar AND campo2 LIKE '%$termino_a_buscar'

y así con todos ..pero como veras .. ¿ que sucede si quiero buscar por el "campo2" sólo ? .. o si tengo más campos a busar .. no por todos sino por algunos? .. En esos casos es donde tu lógica (en función de como indiques sobre que "campos" se ha de buscar) así compondrás esa sentencia SQL adecuada.

Leistes sobre "FUll text search"? creo que deberías implementar dicho método .. pruebalo.


Un saludo,
  #8 (permalink)  
Antiguo 08/03/2005, 08:21
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
si si.. creo que mejor miro algo sobre "FUll text search pues de igual forma, no se porque para parámetro van a buscar.. si tengo 5, el usuario podria tener un parámetro, o cinco.. o entre 1 y 5... y son diferentes.. mmm ok, ya es más cuestión de lógica...

Gracias.. muacksss!!!
  #9 (permalink)  
Antiguo 08/03/2005, 09:15
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
hola de nuevo...

Resulta que ya cree mis índices con full text.. pero me he encontrado con que esto solo sirve para campos tipo var, char, text,... algunos de mis campos o parámetros de búsqueda son asi de este tipo, pero tengo otros que son tipo int??... entonces.. como hacer para que estos entren en el select.. o tendria que ir armando mi select si alguno de estos campos que tengo como enteros son seleccionados???
  #10 (permalink)  
Antiguo 08/03/2005, 09:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ahí no sé ..

No sé como se comportará con campos numéricos las busquedas de texto completom. En principio los campos mencionados se indexan así .. los otros tal vez no sean indexados así, pero si que puedas usarlos (podrías probarlo o preguntar en el foro de "Base de datos" .. pues eso es problema integro de SQL (de Mysql)).

Un saludo,
  #11 (permalink)  
Antiguo 08/03/2005, 09:47
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
ok, gracias.. pero bueno full text no funciona con campos numéricos, pues incluso genera error al intentar usar uno de los campos int.. para usarlo como parte del indice en full text...

Gracias.
  #12 (permalink)  
Antiguo 09/03/2005, 08:09
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
Una pequeña duda...

ya tengo mi indice y mi consulta a la base de datos con full text.. todo funciona.. me trae los registros que tienen los datos que estoy buscando.. pero ahora.. mmm como hago para especificar en que campo quiero buscar es decir:

tengo mi indice full text indice_busqueda que esta compuesto por varios campos... campo1, campo2, campo3

algo asi indice_busqueda: campo1, campo2, campo3

bueno tengo un furmulario, donde el usuario puede realizar la busqueda por cualquiera de esos tres campos... 1.2.3

el sistema va y hace la respectiva consulta, pero por ejemplo, si el usuario en el campo1 digito... "prueba de campo" pero resulta que en mi base de datos el campo que tiene el texto "prueba de campo" no es el campo1 si no el campo3, el de todas formas me trae la consulta... es decir, como hago para que el usuario si me digita en el campo1, busque solo en el campo1...??? porque el si con full text me trae las consultas de una manera excelente, pero compara todos los campos que tengo como indice... y trae la información...

Espero me hayan entendido

Código PHP:
$campo1 "prueba de campo"// información que tomo desde el formulario
if(!$rs->query("select *  from tabla  where match(campo1, campo2, campo3)
   against('$campo1 $campo2' in boolean mode)"
))
{
      
// Y ejecutamos nuestra consulta.
     
die( $rs->error() ); // Si Query devolvió falso, hubo un error y lo mostramos.


Última edición por Salome; 09/03/2005 a las 08:11
  #13 (permalink)  
Antiguo 09/03/2005, 08:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En ese caso .. volvemos al principio (a lo mismo que te comenté).


debes formar sentencias SQL .. No sé como haces para seleccionar el campo en el que buscar (podrías poner el código de tu formulario para verlo claro) pero .. a base de if() y empty() deberías formar condicionales para usar una u otra SQL:

Código PHP:
if ($_POST['buscar_en_campo'] == "campo1"){
$sql="select *  from tabla  where match(campo1) 
   against('$campo1' in boolean mode)"
;
}

if (
$_POST['buscar_en_campo'] == "campo2"){
$sql="select *  from tabla  where match(campo2) 
   against('$campo2' in boolean mode)"
;

o algo más versatil:

Código PHP:
$sql="select *  from tabla  where match(".$_POST['buscar_en_campo'].") 
   against('"
.$_POST['termino_a_buscar']."' in boolean mode)"
Eso sería un ejemplo básico para "buscar en un sólo campo" concreto (el que indiques).

El caso es que te quede un $sql que ejecutar según tus condiciones.

Un saludo,

Última edición por Cluster; 09/03/2005 a las 08:35
  #14 (permalink)  
Antiguo 09/03/2005, 08:40
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
Es un formulario normal donde tengo varios campos y digo porque desea buscar...por decir algo:

titulo
autor
idioma

mmm si entonces seria campo por campo, pues igual si no lo tuviera en forma boolean mode, tendria que poner en el match() todos los campos del indice... pero entonces como podria hacer.. tengo 8 parámetros de busqueda y mi usuario puede elegir 1 o más parámetros al tiempo...

asi que no podria limitar el if a solo comparar un campo...



if ($_POST['buscar_en_campo'] == "campo1"){
$sql="select * from tabla where match(campo1)
against('$campo1' in boolean mode)";
}


en el againts.. no existira la posibilidad de poner un orden.. igual que el indice... es decir.. que si tiene campo1 y campo2 en match() se comparen de igual forma en against?.. o definitivamente toca ir armando los querys con los if.. esto no seria eficiente.. te imaginas de 8 posibilidades cuantos if pueden resultar... las probabilidades son muchas...

Última edición por Salome; 09/03/2005 a las 08:42
  #15 (permalink)  
Antiguo 09/03/2005, 09:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si, .. me lo imagino .. Pero, esa es una solución .. de todas formas esos "if()" para llegar a tu SQL "condicional" podrías automatizarlos .. Por ejemplo en $_POST (o $_GET) tienes un array .. como tal puedes recorrerlo con un bucle foreach() y de ahí ir creando tu sentencia SQL (para el caso y para PHP: un string más) concatenando (como cualquier otro tipo de strings).

Si hay soluciones mejores .. supongo que serán vía SQL (en Mysql y su SQL también puedes hacer condiciones "if() .. y demás) .. revisa los manuales de SQL de Mysql o bien consulta en el foro de Base de datos por si existen alternativas mejores del lado del "SQL".

Un saludo,
  #16 (permalink)  
Antiguo 09/03/2005, 09:24
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
ok... gracias...
  #17 (permalink)  
Antiguo 14/03/2005, 12:22
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mmmm bueno tengo este select asi...

SELECT * FROM tabla1
WHERE MATCH(campo1, campo2) AGAINST('campo1 campo2' IN BOOLEAN MODE)

ok.. funciona.. y si quiero a ese mismo select.. agregarle una consulta a otra tabla!.. mm con un OR... pero que sea en el mismo select.. tabla2.. como seria la sintaxis
  #18 (permalink)  
Antiguo 15/03/2005, 06:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Salome
mmmm bueno tengo este select asi...

SELECT * FROM tabla1
WHERE MATCH(campo1, campo2) AGAINST('campo1 campo2' IN BOOLEAN MODE)

ok.. funciona.. y si quiero a ese mismo select.. agregarle una consulta a otra tabla!.. mm con un OR... pero que sea en el mismo select.. tabla2.. como seria la sintaxis
Tienes el foro de "Base de datos" para este tipo de preguntas ...

En principio .. no sé si conoces .. pero las referencias a varias tablas se hacen usando:

nombre_tabla.campo .. incluirlas en el FROM o usar JOIN o incluso UNION ..

Repasa el manual oficial de Mysql y su SQL particular. www.mysql.com

Un saludo,
  #19 (permalink)  
Antiguo 15/03/2005, 06:41
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
Si, si se como se hace referencia a otras tablas.. solo que pensé que tengo dudas en como se hace cuando uso el full text... pero bueno me iré entonces para el foro de base de datos.. gracias...
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 22:38.