Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Skeletron en 4 Agosto 2009, 09:03 am



Título: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 4 Agosto 2009, 09:03 am
WOW.. El nombre que le puse al psot debe haber dado miedo.. jajaja

Señores.. les voy a comentar algo...
Para poder entender lo que les diga, tienen que calibrar su cerebro a NO DISCUTIR EL "PORQUE" DE LA INCOHERENCIA QUE VOY A HACER...

Porque digo esto??.. Por ésto:
Una tabla de mi DATABASE de MYSQL tiene que guardar un dato algo "COMPLICADO".. Consiste en guardar un "nombre" (char) (hasta aca no hay ningun tipo de problema), y ese "nombre" es la identificacion de una secuencia de "CODIGOS"...
A ver...
Imaginen que tengo una tabla donde se guardará un CODIGO grandisimo y con él, un nombre... como un "ID"...

El problema es:
Como me conviene guardar ese codigo???
Seguramente dirán: "WOW... NO ENTIENDO PORQUE LA PREGUNTA TAN IDIOTA"... es porque, el problema viene ahora:
Ese CODIGO esta compuesto por 500 tramos..
Si.. imaginen que "noel" (el nombre) es la identificacion del codigo: 12345678 12345678 12345678 12345678 (y repetir 8 numeros 500 veces)
Sigue todo incoherente, pero aca les aclaro mas el problema ( ;-) )
La web, tiene en su momento, que analizar TODOS los codigos esos que hay guardados con diferentes nombres... en base a otro codigo de 500 pedasos, yo tengo que ver CUALES CODIGOS tienen el X% de pedasos iguales... o sea.. supongamos el 75%.. tengo que mostrar los "NOMBRES" identificadores, de los CODIGOS en la base de datos que coinciden en un 75% sus "PEDASOS" respecto a otro codigo ingresado por el usuario de 500 pedasos...



:)

ESTOY SEGURO QUE NO SABEN QUE RESPONDER.. PORQUE NO ENTIENDEN DONDE ESTA LA PREGUNTA...
La pregutna es:
La tabla: "QUILOMBO": ¿¿¿¿¿¿¿¿¿¿¿tendria que tener un campo: "NOMBRE", y 500 campos llamados: "Pedazo1", "Pedazo2".. Pedazo"500", para poder facilitar la "obtencion" (comparacion) de los PEDAZOS de CODIGO??????????????????


Y la gran pregunta luego, será: "¿Cual es la sentencia que tengo que escribir para chekear que coincidan esos porcentajes?

Nunca les pasó que estan seguros que jamas en la vida va a responder alguien este post???.. yo siento eso...


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Hadess_inf en 4 Agosto 2009, 22:34 pm
Estas loco..

 :silbar: :silbar: :silbar:


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 4 Agosto 2009, 23:02 pm
Jjajajajaj

Ese codigo, es como un "HASH", pero que debe ser comparado por fracciones... Y cada numero, cada valooorrr, de cadaaa fragmenntoooo.. es de mucha importancia.. por eso no puedo crear un HASH


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 4 Agosto 2009, 23:24 pm
Y para que es este 'HASH'?

Por que no usas MD5 o SHA1?.. y te evitas tanto lio..ademas para procesar una cantidad asi de informacion, comparando bloque por bloque con cada registro... :silbar:...espero que tu servidor tenga el ordenador de la NASA o sino.. :xD

Si decis para que quieres usar le HASH se te puede ayudar mejor, o dar un enfoque diferente y mas viable a tu problema  ;)

Saludos


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: isseu en 4 Agosto 2009, 23:38 pm
Si usas un long text (LONGTEXT), y cada tramo esta separado de ; y luego los separas (con php o lo que uses)
es decir:
noel=12345678;12345678;12345678;12345678......
y luego en tu codigo php (por ejemplo)

$array = split(':', $tramosunidos);



Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 4 Agosto 2009, 23:42 pm
Cita de: isseu
Y para que es este 'HASH'?

Por que no usas MD5 o SHA1?.. y te evitas tanto lio..ademas para procesar una cantidad asi de informacion, comparando bloque por bloque con cada registro... :silbar:...espero que tu servidor tenga el ordenador de la NASA o sino.. :xD

Si decis para que quieres usar le HASH se te puede ayudar mejor, o dar un enfoque diferente y mas viable a tu problema  ;)

Saludos


Estoy dando un enfoque diferente...

Disminuiré MUCHO ese "500".. tal vez lo deje en menos de 250, y luego con otra tecnica capaz que a la mitad de 250...


Mira.. imagina que tengo un archivo .txt con gran cantidad de texto... de éste archivo, tomo cada X% una "muestra" de su texto de 8 letras (supongamos 8)... es como "tomar muestras" del interior del archivo... y guardo en MySQL el nombre del archivo (o si posicion en el disco duro) y luego a su derecha, escribo en diferentes campos, esos valores tomados por muestra...

Ahora supon que ya analicé tod mi Disco Duro y tengo en mi base de datos, todos los nombres de mis archivos con sus fragmentos de muestra..

En una aplicacion, creada por mi, le ingreso un archivo .txt de mucho tamaño tambien... la aplicacion hace EL MISMO SISTEMA DE MUESTREO a éste archivo.. cada exactamente el mismo PORCENTAJE con que hacía al DIsco Duro la muestra, tomará las muestras de éste ingresado....


Ahora tendras el CODIGO de éste archivo.. las x cantidad de muestras tomadas...
Y ahora tienes que COmparar los pedasos de muestra esos de tu archivo, con los pedasos de muestra que estan en la base de datos...
Aquellos archivos de la base de datos que coincidan en el 50% con el del archivo ingresado, se tienen que mostrar...

De paso agrego otra pregunta:
A esas 8 letras que tomaré como muestra muchas veces, las tengo que guardar en un sistema que me ocupe poco espacio.. el hexadecimal es el mejor?


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 4 Agosto 2009, 23:45 pm
Si usas un long text (LONGTEXT), y cada tramo esta separado de ; y luego los separas (con php o lo que uses)
es decir:
noel=12345678;12345678;12345678;12345678......
y luego en tu codigo php (por ejemplo)

$array = split(':', $tramosunidos);

Eso implicaría "traer" a php todas las lineas de la abse de datos, y analizarlas... no sería MUYYYYYYYYYYYYY DEMASIADOOO LENTO?!?!?!?!?!?!

No hay una manera, o una query con un poco de logica, que me devuelva ya los resultados.. o sea.. que el propio SQL mire cuales coinciden en un X porcentaje..??


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 4 Agosto 2009, 23:56 pm
Si el 'codigo' a guardar es igual o menor a 255 caracteres, podés usar la función levenshtein de PHP para obtener la diferencia entre ambas, ejemplo:

Código
  1. <?
  2. $p1 = "5d4f5A";
  3. $p2 = "5A4F6a";
  4.  
  5. echo levenshtein($p1, $p2);//4
  6. ?>

En este ejemplo obtenemos 4, esta funcion es sensible a mayúsculas y minúsculas(CASE SENSITIVE). Función devuelve la cantidad de caracteres que hay que que sustituir, insertar o borrar para que $p1 se convierta en $p2, a esto se le llama distancia Levenshtein. Dicho de otra forma, esta cadena compara caracter por caracter, y si son diferentes aumentan la cuenta en 1 del resultado de dicha función.

Saludos

P.D.:Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 4 Agosto 2009, 23:58 pm
ay una manera, o una query con un poco de logica, que me devuelva ya los resultados.. o sea.. que el propio SQL mire cuales coinciden en un X porcentaje..??

No. A lo sumo con regexp podes obtener cadenas similares, pero no calcular la diferencia como con levenshtein de PHP. Y si ves que la cantidad de registros a analizares MUY extensa, podes ir haciendolo de a tramos con AJAX. Pero de cuantos estamos hablando?

Y por otro lado no veo la útilidad o proposito de esto.. :silbar: :)

Saludos


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 00:12 am
Y por otro lado no veo la útilidad o proposito de esto.. :silbar: :)

Me parece que lo dejé claro en el inicio:
Citar
Señores.. les voy a comentar algo...
Para poder entender lo que les diga, tienen que calibrar su cerebro a NO DISCUTIR EL "PORQUE" DE LA INCOHERENCIA QUE VOY A HACER...

Y la tecnica de arriba no es lo que busco.. porque esas 8 letras tienen que ser EXACTAMENTE IGUALES para poder sumar 1 punto mas de "fragmentos" iguales..


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 5 Agosto 2009, 01:12 am
Entonces mete el codigo en un array, donde cada 'fragmento' de 8 caracteres sea elemento de dicho array. Y en un bucle comparás los arrays, comparando cada indice de un array con su semejante del otro dado que todos tienen el mismo numero de elementos.

Ejemplo:
Código
  1. <?
  2. $a1 = array(40195922, 47449645, 60449218, 52871398, 78398375,11565551, 65489196, 80510253);
  3. $a2 = array(40195922, 28767395, 96896362, 12172546,78398375, 78398375, 17165832, 92326049);
  4.  
  5. $fragmentos_iguales = 0;
  6. foreach($a1 as $indice=> $valor)
  7. {
  8. if($a2[$indice]==$a1[$indice]) $fragmentos_iguales++;
  9. }
  10. echo $fragmentos_iguales;//en este ejemplo sera 2
  11. ?>


Esto le harias dentro dentro del bucle while($row = mysql_fetch_array($result)).

Pero en ese caso $fragmentos_iguales seria un array tambien, donde le subirias a cada elemento $fragmentos_iguales[$row[id]]. Y asi tenés un array con la cantidad de fragmentos iguales para cada campo en la tabla, indexados por el id de dicho registro.

Saludos


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 01:23 am
Unsigned..luego de decirte éste me pegaras:

Acepto y me gusta tu opinion.. pero.. ese no es mi problema...
Yo analizar el codigo, ya se como hacerlo..

Mi duda era como guardar para luego analizar... o como guardar para que MySQL analice (eso era lo que yo queria)
Pero parece que es imposible que MySQL realice el analisis...
Entonces quedará esa OPCION que NO QUERIA HACER... la cual consistirá en:
Guardar en binario los datos...
Y para comprarlos, TENDRE QUE EXTRAER TOOODAAA LA BASE DE DATOOOSSSSSS.. o sea.. recuperar linea por linea.. y analizarla..

Será un quemadero de CPU GENIAL!!!... :)


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 5 Agosto 2009, 01:27 am
 :xD :xD si, en eso tienes razon, pero podes ir haciendolo por partes con ajax y algo de lógica  ;)

Saludos.

PD: Recien modifique mi anterior mensaje.


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 01:31 am
Ajax?? o sea.. que "quieres" que haga con Ajax???


Y va otra pregunta:

Si 1 solo codigo php analiza toda la base de datos... será LENTOOO...
Peroo.. y si "ejecuto" varios buscadores al mismo tiempo??? eso se puede hacer???
O sea.. que se realice simultaneamente 2 busquedas.. una desde el principio hasta la mitad, y otra que busque desde la mital hasta el final..
Para ocupar mas CPU...
Que me dicen?? se puede hacer algo asÍ??


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 5 Agosto 2009, 01:53 am
A ver..primero que nada...

Lo que querés hacer es una herramienta en PHP que solo vos vas a usar en local? o una funcion en una pagina web disponible para 'cualquiera'?

Porque siendo lo primero, podés usar el LIMIT de SQL para ir leyendo de a (por ejemplo) 500 registros.

Pero mi duda es lo que pregnte primero. Estas tratando de hacerte una 'herramienta' con PHP y MySql?
Peroo.. y si "ejecuto" varios buscadores al mismo tiempo??? eso se puede hacer???
O sea.. que se realice simultaneamente 2 busquedas.. una desde el principio hasta la mitad, y otra que busque desde la mital hasta el final..
Para ocupar mas CPU...
Que me dicen?? se puede hacer algo asÍ??

Si se puede 'emulando' multi-hilos(threads). Osea, de poder se puede, pero sera menos rapido aun porque PHP no sorpota este tipo de programación.  :-\

Y por otro lado de cuantos posibles registros estamos hablando? Te recomiendo que probes usando ESTO (http://foro.elhacker.net/desarrollo_web/importante_duda_sobre_consulta_sql_avanzada-t263268.0.html;msg1283394#msg1283394) implementandolo como una funcion. Seteando el timelimit de jecucion a 0 (sin limite) y ver cuanto tarda.


Ajax?? o sea.. que "quieres" que haga con Ajax???

Que hagas una página en php por ejemplo saca_fragmentos_iguales.php.
Que esta página reciba dos parametros(por url) que se le pasaran al LIMIT donde hagas la consulta SQL.
Esta pagina la llames desde otra, la que vera el usuario, pasandole dichos parámetros aumentados en cada nueva llamada. Si supieras AJAX sabrías de lo que te hablo..y es una opcion muy efectiva sin ningún contratiempo.

Lo que haría, básicamente, es ir llamando a un script php que valla sacando los registros de a tramos de por ejemplo 500 registros por vez. Cuando esta pagina termine su trabajo le regresara los resultados a la principal, la que la llamo. y luego la principal la volveria a llamar pero aunmentando los parámetros para el LIMIT asi se tomaria el siguiente bloque de 500 registros de la tabla...y así susecivamente..

Te pondría un ejemplo, pero la verdad que me he olvidado un poco el trabajo con AJAX porque hace meses no lo uso para nada.  :-[

Saludos


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 02:04 am
Respondo la pregunta:
Será un BUSCADOR.. así como Google ( bueno... me agrandé un poco :xD )..
TOdo el mundo podrá utilizarlo.. y todo el mundo lo utilizará y Google me lo comprará y yo le diré: "No.. se lo voy a regalar a Microsoft" jajaja

VOlviendo al tema:
Tu lo que dices hacer, es "tomar" 500 entradas de la Base de Datos, y al terminar, "tomar" otras 500 mas.. y así..
Claro.. yo tambien digo eso... PERO... el problema no está en tomar entradas.. sino en el analisis que hay que darles..

Supongamos que "ejecuto": analisis1.php y analisis2.php
El 1º toma la primer mitad de la abse de datos y la analiza, y el 2º, toma la 2º mitad y la analiza...
Perooo.. SIMULTANEAMENTE TENDRIA QUE SER TODO ESO!!..
El analisis y toma de datos de la base de datos tiene que ser simultaneo... entiendes?


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 5 Agosto 2009, 02:20 am
Por eso..la página que toma de SQL te devuelve los resultados ya procesados pasados, por ejemplo, por la función que yo te di. Y hasta podés hacer que sea en XML.

Saludos

PD: Me voy a comer  :xD


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 02:30 am
Pero tio...
a ver..
Pongamos las cosas en claro...

TU dices: "la página que toma de SQL te devuelve los resultados" claro.. porque toma las primer mitad de la base de datos.. analiza y devuelve los valores
PERO... luego tendria que ejecutar el 2º archivo... PEROOO.. así no ganaria tiempo..

Necesito 2 algoritmos de analisis ejecutados al mismo tiempo!!... Y con PHP se puede hacer eso?

Supongamos que en al web incluyo con "include" los 2 archivos: Analisis1.php y analisis 2.php ambos archivos tienen sus "function" donde analizan la abse de datos.

Si yo en la web pongo luego:
analizarprimertamo()
analizarsegundotramo()
lo que hará es analizar el primer tramo, y al terminar, analizará el 2º..

Y yo quiero que se hagan al mismo tiieempooo... y que los 2 vallan devolviendo resutaldos (por echo "EL archivo xxx coincide con el ingresado") mientras van encontrando...

Me entienden o ya estoy loco?


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 02:35 am
Me acaban de decir algo:

"Si lo que tu quieres es mejorar el tiempo de uso de la CPU ejecutando 2 hilos simultaneos, puedes hacerlo de otra manera: Dandole prioridad de 90% de CPU a APACHE (httpd.exe) y tendrás un rendimiento mejor que abrir 2 hilos"


:O

es verdad eso?


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: [u]nsigned en 5 Agosto 2009, 02:43 am
Me acaban de decir algo:

"Si lo que tu quieres es mejorar el tiempo de uso de la CPU ejecutando 2 hilos simultaneos, puedes hacerlo de otra manera: Dandole prioridad de 90% de CPU a APACHE (httpd.exe) y tendrás un rendimiento mejor que abrir 2 hilos"


:O

es verdad eso?

Parece lógico, debe ser verdad, puesto que apache tomaria casi todo el micro. Pero salvo que tengas un server propio o dedicado, mejor no te molestes mucho con eso porque los planes 'normales' de hosting no permiten acceder a este tipo de configuraciones del sistema.

Saludos


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 04:41 am
Noo..
A esta web, es probable que la haga en mi PC.. en un server mio... U.U


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: SnakeDrak en 5 Agosto 2009, 05:13 am
Hola,

Ps.. no le veo sentido a lo que quieres hacer, yo tengo un hash que no se puede descifrar (no por ahora) y no tiene más de 10 lineas (claro que tiene muchas funciones) y tampoco devuelve una cadena muy grande, pero es suficiente, bueno aún así puedes hacer lo que dices sin necesidad de almacenar todo en una variable PHP, pongamos que cada parte del HASH tiene 5 números, almacenaremos todos en un LONGTEXT y lo separaremos con ; (solo para que sea entendible), entonces tenemos:

campo hash (LONGTEXT): 32456;54567;23450;12346;

Ese sería un ejemplo donde cada parte tiene 5 números y hay un total de 4, si queremos seleccionar solo el hash 3 pues sería: 3*(5+1)

Código
  1. SELECT SUBSTRING( `hash` , (3-1)*(5+1)+1, 5 ) FROM `tabla`
  2.  

Lo pongo con +1 para que sepas donde tienes que cambiar el 5 y el 3, eso seleccionaría todos los terceros hash.

Si aún no lo entiendes dime e intentaré explicarlo mejor.

Aquí tienes funciones de SQL: http://mysql.conclase.net/curso/index.php?fun=SUBSTRING
Saludos!


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 15:36 pm
Pero, para que me hablas de HASH?!?!!? y de Encriptacion???
Yo no tengo que cifrar ningun dato..
Estoy tomando muestras de un archivo y luego comprarlas con otras muestras... no puede haber hashes.. y si los hubiese, sería totalmente en bano...




AGREGO:
Todos me han dicho que es incoherente... Bien... pero IBM le dijo a Bill Gates que las computadoras personales tambien serían totalmente en bano, e incoherentes y nadie las compraria.. y lo mismo pasó con Twitter.. quien iba a querer decir a cada rato que esta haciendo?? o quien iba a querer madnar texto por celular si podia llamar...

En fin amigo.. Cuando algo es INNOVADOR, no quiere decir que sea INCOHERENTE o malo..
Porque supongo que estamos todos TOTALMENTE seguros que yo no di a entender aun el verdadero funcionamiento de la futura web... :) Si realmente quisiera ver si un archivo es igual a otro, simplemente le hago un HASH a todo su contenido y lo comparo con el HASH del que entra...

Porque nadie puede cerrar su ecrebro auna idea que consiste en TOAMR MUESTRAS Y COMPARARLAS... la pregunta era: ¿Puede MySQL hacer la comparacion si coinciden porcentajes? NO fue la respuesta... OK.. entonces tengo que tomar cada linea y analizarla.. FIN del tema..


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: SnakeDrak en 5 Agosto 2009, 16:30 pm
Hola,

AJÁ y yo dije que lo que quieres hacer no tiene sentido pero te di una solución, así que pruebala y deja de decir que MYSQL no puede hacerlo, porque sí puede hacerlo y de hecho te lo puse, puedes comparar las cadenas que quieras almacenandolas todas en un LONGTEXT sin necesidad de recurrir a PHP.

Las historias guardatelas para otra cosa y en vez de leer solo mi primera linea lee todo el mensaje ;) sea hash o sea una cadena, lo que te puse vale igual.

Según he podido leer querías algo así para no tener que comparar todo desde PHP (porque tendrías que almacenar los 500 y los que sea que necesitas..)

Saludos y ojalá te sea de ayuda, lee la función substring y la página que te dejé, estoy seguro de que con esas funciones podrás hacerlo al menos si no estoy equivocado en lo que quieres hacer.


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 21:05 pm
SUBSTRING amigo, devuelve un "pedazo" de una cadena.. ¿ok?
Bueno... ahora... yo tengo que hacerte una pregunta:
Has leido con detalle todos los post de arriba?? hasta el comienzo??? has leido las 2 paginas?
Yo no tengo que "reuperar" strings... tengo que comparar strings con otras strings, y si el 75% coinciden.. o sea, si el 75% son iguales, me tiene de "seleccionar" la entrada esa para devovlerla... pero.. el 75% de los "substrings" de 1 entrada...
Leete bien todo...


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: SnakeDrak en 5 Agosto 2009, 21:33 pm
Hola,

Perdona pero creo que no es forma correcta la tuya de responer, ya no pienso ayudar más para que me respondan así, si no sabes hacerlo aprende un poco más de SQL a y te recomiendo que te expreses un poco mejor porque ni tú tienes clara la idea de lo que quieres hacer y si la tienes clara no te expresas/escribes correctamente y algunas cosas no se comprenden.

Eso que dices se puede hacer sin problemas, comparar strings con otras strings y ver el % de comparación, tal vez no en 1 sola consulta, pero en 2 consultas podrías hacerlo.

Por supuesto si te intentan ayudar y respondes así pues.. no creo que te ayuden.

Saludos y suerte.


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 5 Agosto 2009, 23:29 pm
Amigo, amigo.. no es apra que te enojes...
Me he redactado todo de nuevo y aqui te lo digo:

Introduccion:
Imaginate que tengo la carpeta: C:/ARCHIVOS y en ella hay 50.000 archivos .txt con MUCHO texto tentro
Desde mi web, (PHP) ingresando otro .txt en un formulario, analizaré si hay un archivo "parecido" al ingresado en mi carpeta C:/ARCHIVOS..
El archivo ingresado, se considera "parecido" si: Es totalmente igual, o hasta en un 70% (ésto es lo que produce el problema)

Dato:
El algoritmo de INDEXADO a la base de datos de los archivo de la carpeta, consiste en tomar 10 muestras de 5 "caracteres" de los archivos de C:/ARCHIVOS y guardarlos consecutivamente como 1 sola gran palabra...
O sea: Con un motor, voy a entrar a cada uno de los archivos y voy a tomar ese muestreo y guardarlo en la base de datos a esa gran palabra que me quedó..
La palabra será de 50 caracteres, proque son 10 muestras de 5 Caracteres..


Web:
Desde la web se ingresa X archivo y se le toma el mismo muestreo...


Opciones:
En la base de datos puedo guardar las muestras de varias formas.. por ejemplo con separadores o sin..
Con separadores: 12345;34567;98654;98764 (y así hasta llegar a las 10 muestras)
O sin separadores: 1234567898765432 (y así hasta llegar a las 10 muestras)


Lo que tengo que hacer:
Con la muestra que tengo del archivo ingresado, tengo que COMPRAR los tramos...
O sea.. agarro los primeros 5 caracteres de la muestra del arcchivo ingresado, y los comparo con los 5 primeros caracteres de la 1º entrada de la base de datos.. en caso de ser TOTALMENTE IGUALES, "suma 1 punto", despues compara los otros 5.. y así... al finalizar el escanero de la primer entrada de la base de datos, me va a decir: "Tenemos 8 tramos iguales", por lo tanto, este archivo supera el 70% establecido de "comparacion", y se considera que el archivo ingresado y la 1º entrada de la base de datos son IGUALES o PARECIDOS.. y por lo tanto, tengo que "devolver" esa entrada con MYSQL..
Despues sigue comparando toda la base de datos y me tiene que devolver normalmente (como siempre lo ahce) el array con las entradas que son "aceptadas" por éste algoritmo...

La pregunta:
¿Como hago eso? :)

Es como que, necesito una CONSULTA SUPER LOGICA...
Tengo 3 opciones:
*Que realmente exista una manera de darle esa logica en la entrada SQL y me quedo feliz..
*Que no exista esa manera de darle logica a SQL y por lo tanto tengo que "recuperar" todas las lineas de la base de datos y compararlas con un algorirmo normal de PHP
*Ponerme a hacer una base de datos que soporte ese sistema de LOGICA y llenarme muy de guita...


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: ^Tifa^ en 9 Agosto 2009, 01:08 am
Hola.

Aunque no te he comprendido 100% tu solicitud (Asumo que igual que el resto juas  :xD )
quiero intentar ayudar  :rolleyes:

Tu peticion si puede realizarse enteramente dentro de MySQL sin problema alguno, pero ojo con esto porque tus peticiones requeriran mucho consumo de RAM dependiento el tamanio que utilizaras para ir comparando valor por valor (Tu entiendes).

Se me ha ocurrido lo siguiente, Tengo 2 tablas :

Código
  1.  
  2. mysql> SELECT * FROM original;
  3. +--------+---------------+
  4. | codigo | nombres       |
  5. +--------+---------------+
  6. |      1 | Luis Castro   |
  7. |      1 | Pedro Sanchez |
  8. |      1 | Maria Lopez   |
  9. |      1 | Juan Veinte   |
  10. |      1 | Pepe Carlos   |
  11. +--------+---------------+
  12. 5 ROWS IN SET (0,00 sec)
  13.  
  14. mysql> SELECT * FROM archivo;
  15. +---------------+--------+
  16. | palabra       | codigo |
  17. +---------------+--------+
  18. | Pedro Sanchez |      1 |
  19. | Marcia Mama   |      1 |
  20. | Juan Veinte   |      1 |
  21. | Pepe Carlos   |      1 |
  22. +---------------+--------+
  23. 4 ROWS IN SET (0,00 sec)
  24.  

Con los datos ahi mostrados. La tabla original es una tabla guardada en motor MyIsam y la tabla archivo es una tabla guardada en motor Memory... la razon que elegi Memory para la segunda es sencillamente que la segunda tabla sera la encargada de alojar los datos que se encuentren en un 'archivo.txt' no quiero registros definitivos, sino temporales y alojados unicamente en la memoria como si fuesen datos dinamicos  ::) por ende la tabla archivo esta en motor Memory. Los datos a la tabla archivo los cargue con el tipico :

LOAD DATA LOCAL INFILE 'ruta/archivo' INTO archivo;

prosigo... tenemos las 2 tablas anteriores, ahora yo quiero guardar en alguna parte dentro de la DB los valores en modo real que vayan insertandose en la tabla archivo y concuerden con la tabla original, entonces hago una vista ::

Código
  1.  
  2. mysql> CREATE VIEW Ceros AS SELECT strcmp(palabra, nombres) AS total FROM original INNER JOIN archivo HAVING(total) = 0;
  3. Query OK, 0 ROWS affected (0,00 sec)
  4.  
  5.  

la funcion STRCMP funciona igual que en lenguajes C por ende no creo que deba explicarla mucho, pero si te sirve cuando 2 campos comparados son identicos dicha funcion devuelve valor cero, y como en este caso a mi solo me interesan los valores identicos agrego el predicado having igualandolo a cero, asi solo recogos todos los datos identicos en la comparacion  ;)  para gastar menos memoria a la hora de devolver lol...

Ahora viene la mejor parte del asunto :) cree un procedimiento almacenado, para buscar tu objetivo final (Que hayan mas de 70% de registros similares entre ambas tablas)

Código
  1.  
  2. mysql> delimiter $
  3. mysql> CREATE PROCEDURE proceso(OUT palabra CHAR(15), OUT resultado INT)
  4.    -> BEGIN
  5.    -> DECLARE valor_original INTEGER;
  6.    -> DECLARE valor_similar INTEGER;
  7.    -> SELECT COUNT(total) INTO valor_similar FROM Ceros;
  8.    -> SELECT COUNT(*) INTO valor_original FROM original;
  9.    -> SELECT substr((valor_similar/valor_original)%100, 3, 2) INTO resultado;
  10.    -> IF ( resultado > 70 ) THEN
  11.    -> SELECT concat('Hay un 71% o mayor de similares');
  12.    -> ELSE
  13.    -> SELECT concat('Hay un menor de 70% de similares');
  14.    -> END IF;
  15.    -> END;
  16.    -> $
  17. Query OK, 0 ROWS affected (0,00 sec)
  18.  
  19. delimiter> ;
  20.  
  21.  

Perfecto... ahora el procedimiento lo que hace es siempre recoger los valores totales iguales en la vista Cero (Que al ser una vista siempre estara actualizada en tiempo real a cualquier proceso DDL o DML que se apliquen en ambas tablas  ;) ) y basados en dicho resultados, dividido entre el total de todos los registros que componen la tabla original y sacando un porciento, tendremos un resultado :) en este caso solo tenemos 5 valores identicos a la tabla original que contiene 8 registros por lo que si llamamos al procedimiento proceso tendremos :

Código
  1.  
  2. mysql> CALL proceso(@todo, @todito);
  3. +--------------------------------------------+
  4. | concat('Hay un menor de 70% de similares') |
  5. +--------------------------------------------+
  6. | Hay un menor de 70% de similares           |
  7. +--------------------------------------------+
  8. 1 ROW IN SET (0,00 sec)
  9.  
  10. Query OK, 0 ROWS affected (0,00 sec)
  11.  
  12.  
  13.  

Pero si le agregamos mas registros similares a ambas tablas, y luego volvemos a llamar al procedimiento tendriamos ::

Código
  1.  
  2. mysql> CALL proceso(@todo, @todito);
  3. +-------------------------------------------+
  4. | concat('Hay un 71% o mayor de similares') |
  5. +-------------------------------------------+
  6. | Hay un 71% o mayor de similares           |
  7. +-------------------------------------------+
  8. 1 ROW IN SET (0,01 sec)
  9.  
  10. Query OK, 0 ROWS affected (0,01 sec)
  11.  
  12. mysql> SELECT COUNT(total) FROM Ceros;
  13. +--------------+
  14. | COUNT(total) |
  15. +--------------+
  16. |            8 |
  17. +--------------+
  18. 1 ROW IN SET (0,00 sec)
  19.  
  20. mysql> SELECT COUNT(*) FROM original;
  21. +----------+
  22. | COUNT(*) |
  23. +----------+
  24. |       11 |
  25. +----------+
  26. 1 ROW IN SET (0,01 sec)
  27.  
  28.  
  29.  

Vas captando mas o menos lo que intento decir  :silbar:

No se si te sirva... espero que si, recuerda que la tabla archivo al estar en motor memory si reinicias, o apagas la DB todos los datos seran eliminados (ya que solo se alojan temporalmente en la memoria ram, asi sacas mas provecho del espacio de ram y accesa mas rapido a los registros).... pero yo te recomendaria que crees un evento CREATE EVENT dentro de MySQL que cada cierto tiempo haga un TRUNCATE a la tabla archivo o cada vez que vayas a LOAD DATA LOCAL INFILE un archivo nuevo le pases un TRUNCATE primero, seguido de un FLUSH TABLES para que limpies la Cache en caso de que uses Cache (Que no te la recomendaria ya que darias mucho uso constante de TRUNCATE) en caso que no uses Cache, pasa cada cierto tiempo un RESET ayuda para desfragmentar...

Intenta si vas a guardar solo caracteres separados de menor de 255 que sean char, ya que longtext o blob o text o similar... la verdad, consume mucho espacio innecesario de memoria y si no vas a dar uso de datos binarios no vale la pena.

Un saludo :)


Título: Re: Importante duda sobre Consulta SQL AVANZADA
Publicado por: Skeletron en 10 Agosto 2009, 00:35 am
Wow..
Muchas Gracias..
Me diste a entender principalmente que me tengo que leer un BUEN tutorial de MySQL :)

Muchas gracias.. ya volveré al psot a analizar bin todo eso cuando conozca mas de MySQL