Hola.
Aunque no te he comprendido 100% tu solicitud (Asumo que igual que el resto juas
)
quiero intentar ayudar
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 :
mysql> SELECT * FROM original;
+--------+---------------+
| codigo | nombres |
+--------+---------------+
| 1 | Luis Castro |
| 1 | Pedro Sanchez |
| 1 | Maria Lopez |
| 1 | Juan Veinte |
| 1 | Pepe Carlos |
+--------+---------------+
5 ROWS IN SET (0,00 sec)
mysql> SELECT * FROM archivo;
+---------------+--------+
| palabra | codigo |
+---------------+--------+
| Pedro Sanchez | 1 |
| Marcia Mama | 1 |
| Juan Veinte | 1 |
| Pepe Carlos | 1 |
+---------------+--------+
4 ROWS IN SET (0,00 sec)
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 ::
mysql> CREATE VIEW Ceros AS SELECT strcmp(palabra, nombres) AS total FROM original INNER JOIN archivo HAVING(total) = 0;
Query OK, 0 ROWS affected (0,00 sec)
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)
mysql> delimiter $
mysql> CREATE PROCEDURE proceso(OUT palabra CHAR(15), OUT resultado INT)
-> BEGIN
-> DECLARE valor_original INTEGER;
-> DECLARE valor_similar INTEGER;
-> SELECT COUNT(total) INTO valor_similar FROM Ceros;
-> SELECT COUNT(*) INTO valor_original FROM original;
-> SELECT substr((valor_similar/valor_original)%100, 3, 2) INTO resultado;
-> IF ( resultado > 70 ) THEN
-> SELECT concat('Hay un 71% o mayor de similares');
-> ELSE
-> SELECT concat('Hay un menor de 70% de similares');
-> END IF;
-> END;
-> $
Query OK, 0 ROWS affected (0,00 sec)
delimiter> ;
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 :
mysql> CALL proceso(@todo, @todito);
+--------------------------------------------+
| concat('Hay un menor de 70% de similares') |
+--------------------------------------------+
| Hay un menor de 70% de similares |
+--------------------------------------------+
1 ROW IN SET (0,00 sec)
Query OK, 0 ROWS affected (0,00 sec)
Pero si le agregamos mas registros similares a ambas tablas, y luego volvemos a llamar al procedimiento tendriamos ::
mysql> CALL proceso(@todo, @todito);
+-------------------------------------------+
| concat('Hay un 71% o mayor de similares') |
+-------------------------------------------+
| Hay un 71% o mayor de similares |
+-------------------------------------------+
1 ROW IN SET (0,01 sec)
Query OK, 0 ROWS affected (0,01 sec)
mysql> SELECT COUNT(total) FROM Ceros;
+--------------+
| COUNT(total) |
+--------------+
| 8 |
+--------------+
1 ROW IN SET (0,00 sec)
mysql> SELECT COUNT(*) FROM original;
+----------+
| COUNT(*) |
+----------+
| 11 |
+----------+
1 ROW IN SET (0,01 sec)
Vas captando mas o menos lo que intento decir
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