Foros del Web » Programando para Internet » PHP »

Lógica de buscador con 3 parámetros

Estas en el tema de Lógica de buscador con 3 parámetros en el foro de PHP en Foros del Web. Hola a todos, Llevo más de 10 horas tratando de sacar un algoritmo que pueda resolverme este problema. Tengo un sistema de búsqueda de noticias ...
  #1 (permalink)  
Antiguo 21/04/2005, 16:45
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 19 años, 7 meses
Puntos: 5
Lógica de buscador con 3 parámetros

Hola a todos,

Llevo más de 10 horas tratando de sacar un algoritmo que pueda resolverme este problema. Tengo un sistema de búsqueda de noticias en una BD basado en 3 parámetros: categorías, usuarios, fecha.

El usuario puede buscar noticias por categorías, por usuarios que la publicaron o por fecha de publicación. Todo esto en un mismo formulario.

El funcionamiento básico sería el siguiente:

si no se colocó categoría, entonces buscar usuario y fecha
si no se colocó usuario, entonces buscar categoria y fecha
si no se coloco usuario ni categoría, entonces buscar solo fecha
si se coloco categoria y usuario, buscar tambien en fecha
si no se coloco fecha ni tampoco categoria y usuario, dar error

Creo que aún quedan más combinaciones... en resumen... el sistema debe buscar en la BD basándose en alguno de los parámetros especificados. Si no se especifica ningún parámetro, entonces dar error.

¿Qué lógica puedo usar para manejar esta búsqueda?

Gracias!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #2 (permalink)  
Antiguo 21/04/2005, 17:05
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 7 meses
Puntos: 0
bueno, es mas sencillo de lo que parece, yo lo manejo en una función que a su vez llama a otras funciones.

Tienes tu base y de ahi solo te fijas si los demas estan vacíos o no, es decir, tu base es...

$qry = "SELECT * FROM noticias WHERE ";

ya luego tendrías que mandar a llamar a la función que te regrese la cadena de cada uno de los 3 parámetros..

$fecha = daCadF($fecha);
$categ = daCadC($cat);
$usu = daCadU($usuario);

estas 3 funciones lo que te hacen es comparar si tu cadena viene vacía o no, en dado caso de que vengan vacías regresas una cadena vacía, en dado caso que tengas datos, entonces haces la parte que le corresponda a la función

Ejemplo...

function daCadF($fecha)
{
$qry = "";

if($fecha != "")
$qry .= " AND fecha_noticia < $fecha ";

return $qry;
}

Asi para cada uno, al final ya nomas la pegas a tu qry principal, es decir, debajo de la llamada a las funciones, tendrias que tener.

$qry.= $fecha.$categ.$usu;


Claro, antes debiste haber comprobado si las 3 cadenas estan vacías. o bien con el resultado de tu llamado a las 3 funciones, o desde antes cuando las recibes, o desde antes en tu JavaScript.

Saludos!
  #3 (permalink)  
Antiguo 21/04/2005, 17:16
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 19 años, 7 meses
Puntos: 5
¿Y cómo se hace con los AND?

Si $fecha es la única que no esta vacía entonces la consulta quedaría:

$qry = "SELECT * FROM noticias WHERE AND fecha_noticia < $fecha";

Eso da error supongo...

Sin embargo, la lógica es excelente!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #4 (permalink)  
Antiguo 21/04/2005, 17:18
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 19 años, 7 meses
Puntos: 5
Creo que para evitar eso podríamos poner una condición común para todas, asi:

$qry = "SELECT * FROM noticias WHERE id<>0 AND fecha_noticia < $fecha";

Quedando el $qry inicial como:

$qry = "SELECT * FROM noticias WHERE id<>0 ";

(¿distinto es "<>" o "!=" en SQL?)
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #5 (permalink)  
Antiguo 21/04/2005, 17:25
Avatar de Gabriel0702  
Fecha de Ingreso: febrero-2005
Mensajes: 155
Antigüedad: 19 años, 1 mes
Puntos: 0
Echa un vistazo a lo que respondí en este Post. Espero que te sirva.

http://desaweb.forosdelweb.com/showthread.php?t=289129
  #6 (permalink)  
Antiguo 21/04/2005, 17:38
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 7 meses
Puntos: 0
jajaja, me salté esa parte del WHERE con el AND, es cosa sencilla hombre, antes de tiempo lo puedes solucionar de 2 maneras.

1. Si desde el JS no dejas que vayan las 3 vacías forzozamente deberá ir una de ellas llena, así que no habría problemas con el WHERE.

2. Si desde que entras a la función haces ese checkup de las variables y detectas que viene vacía, pues igual ya no entra a formar el query, con lo cual, tampoco habría problema con el WHERE.

De otra forma siempre habrá forma de librar esa parte, ya sea con esa parte del id que mencionas,o bien reacomodando todo o haciendo verificaciones, en fin, que la idea de como formar el query espero que te sirva, al menos yo así lo manejo en todas mis búsquedas y siempre salgo adelante.

Saludos!!
  #7 (permalink)  
Antiguo 22/04/2005, 12:23
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 19 años, 7 meses
Puntos: 5
Ohh !!!.. tengo un problema...

Resulta que la tabla que contiene las noticias(titulo, fecha, cuerpo) es una, y la que contiene los usuarios y las categorías es otra.

La tabla de usuarios y categorías tiene esta estructura:

(cat_usr)
id
id_categoria
id_usuario
id_noticia

Entonces... hay que buscar primero en la tabla "cat_usr", para poder sacar el id de la noticia, que luego se deberá buscar en la tabla "noticias".

¿Qué me recomiendan?... ¿Hago un JOIN o algo asi en la consulta SQL?
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #8 (permalink)  
Antiguo 22/04/2005, 13:40
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Si queres sacar el nombre de la categoria si deberas joinear, sino no es necesario, ya tenes el id de dicha categoria en la tabla de noticias.
" Select * from noticias n inner join categorias c on c.id = t.categoria"

Con el tema del where, yo simpre pongo:
" Select * from table where (1=1) "
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #9 (permalink)  
Antiguo 22/04/2005, 14:56
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 7 meses
Puntos: 0
asi es amigo,todo depende, si de ambas tablas piensas sacar datos entonces si necesitas hacer un JOIN , que igual es muy sencillo, en realidad los datos que piensas sacar no van a variar, asi que serán parte de tu query base, al contrario, eso nos ahorraría la parte del WHERE que ayer estuvimos viendo, ya que tendrías algo parecido a...


$qry = "SELECT t1.d1, t1.d2,t1.dn,t2.d1,td.dn FROM noticias WHERE ";
$qry .="t1.d1 = t2.d1 ";(suponiendo que son las que hacen el JOIN)

Luego la parte de la llamada a las 3 funciones

Y despues ya las juntas

$qry .=$fecha.$categ.$usu;

Y ya, saltaste la parte del WHERE sin problemas.

Suerte!!
  #10 (permalink)  
Antiguo 22/04/2005, 22:32
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 19 años, 7 meses
Puntos: 5
Pero son varias condiciones...

El tiene que buscar en la tabla cat_usr aquella id_noticia que coincida con id_usuario e id_categoria. Luego, esa id_noticia tiene que buscarla en la tabla noticias siempre y cuando coincida con el campo fecha. Les pongo una gráfica que hice, la cual explica mejor el flujo de la búsqueda:



¿Cómo sería la consulta SQL para ese caso?
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #11 (permalink)  
Antiguo 22/04/2005, 23:37
 
Fecha de Ingreso: julio-2004
Ubicación: Puerto Vallarta, Jalisco, Mexico
Mensajes: 186
Antigüedad: 19 años, 9 meses
Puntos: 0
seria algo asi
Código:
$categoria = 1
$usuario = 10
$fecha = "01/01/05"
SELECT * FROM cat_usr,noticias WHERE cat_usr.id_noticia = noticias.id_noticia and cat_usr.id_categoria = $categoria and cat_usr.id_usuario = $usuario and noticias.fecha_publicacion = $fecha
esto te debe de dar un resultado mas o menos asi:
Código:
ID  	id_categoria  	 id_usuario  	 id_noticia  	 id_noticia  	 fecha
1 	       1 	         10 	           10 	             10 	01/01/05
esto lo probe en PHPmyadmin, pero no estoy seguro si funciona a la perfeccion, lo puedes acomodar como mejor te funcione :)
__________________
Shanti Castillo G.

Última edición por Shantic; 22/04/2005 a las 23:51
  #12 (permalink)  
Antiguo 25/04/2005, 14:50
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 7 meses
Puntos: 0
No es difícil!!

Mira, te dejó la construcción de mi Query, yo saco datos de algunas tablas así como te lo he venido comentando.

Código PHP:

#####################################
# Función que construye el query de búsqueda de ofertas
#####################################    
    
function construyeQuery($fecha,$zona,$tipo,$avanzada)
{
    
$qry "";
    
$qry .= "SELECT id_oferta,fecha_oferta,titulo_oferta,estado, ";
    
$qry .= " nom_empresa, empresa.id_empresa ";

    
$dfecha daFechaQ($fecha);
    
$dzona  daZonaQ($zona,1);
    
$dtipo  daTipoQ($tipo,1);
    
    if(
$avanzada != "")
    {
        
$datobus explode("-",daMatchQ($avanzada,1));        
        
$qry .= $datobus[0];
    }
    
    
$qry .= " FROM oferta, estado, empresa, usuario_empresa  ";
        
    if(
$avanzada != "")
        
$qry .= $datobus[1];
    else
        
$qry .= " WHERE ";
        
    
$qry .= $dfecha.$dzona.$dtipo." AND oferta.id_estado_oferta = estado.id_estado ";
    
$qry .= " AND oferta.id_usemp_oferta = usuario_empresa.id_usuario ";
    
$qry .= " AND usuario_empresa.id_empresa = empresa.id_empresa AND oferta.status_oferta = 1 ";
    
    if(
$avanzada == "")
        
$qry .= " ORDER BY fecha_oferta DESC";

    
    return 
$qry;
    

Como ves, recibo 4 parámetros, los cuales pueden venir con algún dato o vacíos, avanzada se refiere a la palabra de búsqueda, por eso aparece con más operaciones, ya que si viene con alguna palabra de búsqueda, mi query se transforma bastante al contrario de si viene vacía, los demás parámetros solo me importan si vienen vacíos agrego una cadena vacía al query, y si vienen llenos entonces agrego la parte del AND y su correspondiente match.

Saludos!

Última edición por yacatl; 25/04/2005 a las 14:56
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 07:31.