Foros del Web » Programando para Internet » PHP »

contar coincidencias

Estas en el tema de contar coincidencias en el foro de PHP en Foros del Web. Hola, hace unos días pregunte en el foro de PHP como ordenar resultados por cantidad de coincidencias http://www.forosdelweb.com/f18/orden...encias-605523/ La verdad es que no le encuentro ...
  #1 (permalink)  
Antiguo 16/07/2008, 01:57
 
Fecha de Ingreso: agosto-2004
Mensajes: 113
Antigüedad: 19 años, 8 meses
Puntos: 0
contar coincidencias

Hola, hace unos días pregunte en el foro de PHP como ordenar resultados por cantidad de coincidencias
http://www.forosdelweb.com/f18/orden...encias-605523/
La verdad es que no le encuentro la vuelta.
La idea que tenia era que de acuerdo a la cantidad de coincidencias en los resultados de la busqueda se produjera el ORDER BY.
Tengo dos tablas, la tabla OPCION con 2 campos (id, opciones) y en la tabla vendedores tengo un campo OPCIONES con los id de la tabla OPCION separados por comas.
Lo que quiero es sumar la cantidad de coincidencias que tiene cada vendedor de acuerdo a la búsqueda.
Si la opcion es MOTO quiero mostrar al lado de coincidencias la cantidad de MOTOS que tiene ese vendedor.
Saludos, gracias
Germán
  #2 (permalink)  
Antiguo 16/07/2008, 03:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: contar coincidencias

¿Por qué tienes esa estructura en la base? Me refiero a separar con comas en un campo los datos. Ello te obliga a usar arrays en PHP para operaciones que fácilmente lograrías hacer con la base de datos si tuvieras otra estructura pensada para sacar luego datos como estos. En mi opinión, deberías tener tres tablas

vendedor
-----------------
idvendedor (PK)
nombre


opcion
----------
idopcion (PK)
opcion


ventavendedor
-------------------
idventa(PK)
refidvendedor(FK)
refopcion(FK)

Si la opcion "moto" tiene el idopcion 1
Buscarías esto:

SELECT v.vendedor, o.opcion, COUNT(o.idopcion) FROM tabla vendedor v INNER JOIN ventavendedor vv ON v.idvendedor= vv.refidvendedor INNER JOIN opcion o ON vv.refopcion=o.idpocion WHERE vv.refidopcion = 1 GROUP BY v.idvendedor ORDER BY COUNT(o.idopcion) DESC

No lo he probado, pero creo que es eso.

Si no tienes muy avanzada la base, te diría que pensaras en cambiar la estructura. Con arrays y lo que tienes podría hacerse algo usando funciones específicas de PHP, pero yo no lo considero la mejor opción y en este foro no escribimos código PHP.
Si decides no cambiar tu estructura, dilo y te haremos alguna sugerencia PHP en el foro PHP. Pero, como te digo, la mejor opcion es una estructura parecida a esta que te propongo.

Última edición por jurena; 16/07/2008 a las 13:55
  #3 (permalink)  
Antiguo 16/07/2008, 04:01
 
Fecha de Ingreso: agosto-2004
Mensajes: 113
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: contar coincidencias

Hola Jurena, la realidad es que esta terminado, queria agregar esa opción de ver la cantidad de coincidencias para que el usuario tenga más información en los resultados.
Creo que lo explique mal, estoy seguro que lo explique mal.
TABLA OPCION (id, opciones donde opciones puede ser (1)250cc, (2)100cc, (3)500c, (4)1000cc)
TABLA VENDEDORES, un campo OPCIONES (1,2,3,4) y un CAMPO TIPO (motos, autos, camionetas)
El usuario elige del campo desplegable la opcion MOTOS y marca en los checkboxs las opciones 250 cc, 500cc y 1000cc y realiza la búsqueda.
Lo que yo quiero contar es de las opciones marcadas, cuantas dan como resultado para cada vendedor (uno que tenga todas las opciones, otro que tenga 2 de las 3 opciones busquedas y asi sucesivamente), de forma tal que en los resultados de la busqueda quedara algo como:
PEDRO, 3 coincidencias
JUAN, 2 coincidencias
ROQUE, 1 coincidencia
RAUL, 1 coincidencia

Espero que ahora me haya explicado mejor, gracias de nuevo
Germán
  #4 (permalink)  
Antiguo 16/07/2008, 11:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: contar coincidencias

He reportado a los moderadores el mensaje para darte una solución en PHP con arrays. Si te soy sincero, no me gusta nada, pues preferiría un cambio en la estructura de la base de datos, pero dada tu situación...:

Código PHP:

<?php
$conexion 
mysql_connect('localhost','root','tuclave');
mysql_select_db("moquehua"$conexion);
$e="2";//carga del botón 1
$f="4";//carga del botón 2
$g="3";//carga del botón 3
$h="1";//carga del botón 4
function busqueda ($a$b$c$d$opcion) {//función que tras introducir los valores de los cuatro botones genera una cadena para la búsqueda con preg_match_all
$patron="([";
if (isset (
$a) && !empty($a)) {$patron.="|$a";}
if (isset (
$b) && !empty($b)) {$patron.="|$b";}
if (isset (
$c) && !empty($c)) {$patron.="|$c";}
if (isset (
$d) && !empty($d)) {$patron.="|$d";}
$patron.="]{1})";
$patron=str_replace("[|""["$patron);
preg_match_all($patron$opcion$cuenta);
return 
count($cuenta[0]);//cuenta de los localizados, situados en el índice [0] del array
}
$query="SELECT vendedores, opciones FROM vendedores WHERE tipo = 'MOTOS'";
$res=mysql_query($query);//consulta
$data= array();//defino un array
while($d mysql_fetch_array($res))  {
$dopcion=$d['opciones'];
$resultados busqueda ($e$f$g$h$dopcion);//aplico la función a la cadena traída de la base
$data[$d['vendedores']] = $resultados;}//cargo los datos de los vendedores y sus coincidencias en el array
arsort($data);//ordeno el array por las coincidencias de forma descendente
reset($data);
foreach (
$data as $key => $valor){echo $key.' '.$valor.'</br>';}//muestro los datos del array
?>
EDITO: Ves todo esto: con una estructura del tipo que te dije y una sintaxis SQL simple, lo lograrías, y hasta creo que sería más rápido, aunque de eso no estoy seguro.

Última edición por jurena; 16/07/2008 a las 13:54
  #5 (permalink)  
Antiguo 16/07/2008, 11:54
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: contar coincidencias

Gracias por reportalo jurema.

moquehua, si la solución o la guía que te está dando jurema, es lo que necesitas, por favor me avisas para mover tu mensaje a PHP.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #6 (permalink)  
Antiguo 16/07/2008, 13:40
 
Fecha de Ingreso: agosto-2004
Mensajes: 113
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: contar coincidencias

Hola, gracias por las respuestas, me parece que la solución que plantean es demasiado engorrosa.
Yo pensaba que haciendo un count() iba a funcionar
Por ejemplo, para contar la cantidad de comentarios que tiene una noticia se puede hacer:
<?
$consulta1="select count(notaid) from comentarios where notaid = '$id'";
$query1 = mysql_query($consulta1);
echo $count=mysql_result($query1,0,0); ?>

Pense, seriamente, que la estructura de las tablas era similar (o casi) y que podia hacer :
<?
$consulta1="select count(id) from opcion where opciones = '$id'";
$query1 = mysql_query($consulta1);
echo $count=mysql_result($query1,0,0); ?>

Evidentemente estaba totalmente errado, porque, además, no seleccionaba nunca al vendedor para que cuente en cada uno las coincidencias.
Les agradezco muchisimo el tiempo que se tomaron pero en esta oportunidad tiro la toalla.
Saludos, gracias de nuevo
Germán
  #7 (permalink)  
Antiguo 16/07/2008, 13:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: contar coincidencias

No te preocupes, Germán.
El código lo he probado y funciona y no es tan engorroso, creo, como código. Podrías aplicarlo casi directamente y lo único que tendrías que hacer es cambiar los nombres de la base, y añadir en lugar de las primeras variables los valores traídos por POST desde los cuatro selectores. No obstante, si finalmente lo dejas, sí es importante, creo, que hayas visto la diferencia entre estructurar los datos de un modo y otro en una base de datos.
Si a BrujoNic le parece bien, el foro adecuado a la solución es, creo, PHP, y allí los especialistas podrán corregirlo y enmendarlo para que otros lo puedan usar.
Suerte.

Jesús
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 21:00.