Autor Tema: [PREGUNTA] Busqueda de elementos repetidos  (Leído 2950 veces)

0 Usuarios y 1 Visitante están viendo este tema.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
[PREGUNTA] Busqueda de elementos repetidos
« en: Julio 13, 2012, 10:21:19 am »
Hola,
Estoy probando algunas cosas, y desarrollando otras, y surge la necesidad de hacer lo siguiente:
Tengo una tabla llamada "tags", estructura:
id (INT) | ref_key (INT) | tag (TEXT)
y otra llamada "matches", estructura:
key1 (INT) | key2 (INT) | matc_count (INT)

En la primera tabla (tags) tengo guardado miles de registros, de los cuales, algunos comparten el "ref_key", ya que eso los vincula entre si.
La idea de esto es, agarrando los registros que tengan el mismo "ref_key", buscar TODOS los otros registros que compartan algun "tag" y agregarlo en la otra tabla. Tambien recolectando la cantidad de "tag" en comun.

Hasta ahora lo hago asi:
(por cada "ref_key" distinto, voy generando estas instrucciones)
Código: (SQL) [Seleccionar]
INSERT INTO matches (key1, key2, match_count) SELECT [key], ref_key, count(ref_key) as match_cnt FROM tags WHERE tag IN ([tags]) AND ref_key <> [key] GROUP BY ref_key ORDER BY match_cnt DESC; donde [key] es reemplazado en VB por un long, y [tags] por una lista de elementos.
EJ:
Código: (SQL) [Seleccionar]
INSERT INTO matches (key1, key2, match_count) SELECT 1507, ref_key, count(ref_key) as match_cnt FROM tags WHERE tag IN ("vilma", "palma", "e", "vampiros", "verano", "traidor", "3980")  AND ref_key <> 1507 GROUP BY ref_key ORDER BY match_cnt DESC;
Obviamente antes de empezar el bucle, se comienza una transaccion, sino seria moustroso el tiempo que tardaria. (y al finalizar, se commitea)

La cosa es que es medio lerdo esto, y no se porque. Recien agregue 20k de elementos en menos de 1s (mediante otro procedimiento, y para otro motivo), y esto tardo aproximadamente 50 minutos (34350582 registros en total).

Algo que en mi codigo NO hice y NO pude hacerlo, es que el "match_cnt" DEBE ser mayor que X (una constante que se puede reemplazar desde VB). No me deja hacerlo ya que dice que con el GROUP BY no es valido.

Acudo a su ayuda :D

Gracias!
« última modificación: Julio 13, 2012, 10:36:36 am por coco »
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[PREGUNTA] Busqueda de elementos repetidos
« Respuesta #1 en: Julio 13, 2012, 01:29:55 pm »
Parece medio rebuscada tu forma de enlazar los datos x'D  pero antes que nada, que motor es?

Ademas no podes usar variables/cursores tipo para no estar haciendo COUNT() ... consume tiempo :P

Y otra cosa, no podes quitar el group by?  no le encuentro la razon porque no haces nada que no sea grupal excepto el count :/

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[PREGUNTA] Busqueda de elementos repetidos
« Respuesta #2 en: Julio 13, 2012, 02:06:55 pm »
es que necesito que el count sea para ESE grupo :D. entonces me dice cuantos otros registros hay en cada "ref_key" distinto
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion