2012-05-18 25 views
7

Realmente agradecería que alguien pudiera validar mi consulta SQL.Mysql Seleccione filas con los mismos valores en una columna y diferente en otra

Para el siguiente conjunto de datos:

MD5  UserPK  CategoryPK  
ADCDE 1   7 
ADCDE 1   4 
ADCDE 1   7 
dffrf 1   7 
dffrf 2   7 
dffrf 2   6 
dffrf 1   1 

me gustaría para seleccionar MD5 y CategoryPK donde existen dos o más filas con valores de MD5 idénticos, CatgegoryPK idénticas y dos o más valores diferentes UserPK.

En otras palabras, me gustaría saber el MD5 y categoríaPK de todos los registros donde dos o más usuarios diferentes (UserPK) han asignado la misma categoría (UserPK) al mismo archivo (Md5). No me interesan los registros que el mismo usuario asignó a la categoría varias veces (a menos que un usuario diferente también haya asignado la misma categoría a ese archivo).

Así que a partir de los datos anteriores, me gustaría ser devuelto simplemente:

md5 CategoryPK 
dffrf 7 

La consulta que he escrito es:

SELECT md5, 
     count(md5), 
     count(distinct categorypk) as cntcat, 
     count(distinct userpk) as cntpk 
FROM Hash 
     group by md5 having count(md5) > 1 
          and cntpk > 1 
          and cntcat = 1; 

Parece que funciona, pero utilizando antes de empezar con ira, agradecería una segunda opinión en caso de que me haya perdido algo o si hay una mejor manera de hacerlo.

Gracias

+3

Este tipo de pregunta podría ser más apropiado para [Revisión Código] (http://codereview.stackexchange.com) que StackOverflow. – eggyal

Respuesta

11

No creo que su código le dará lo que está buscando; ¿Qué sucede cuando varios usuarios han asignado más de una categoría a un archivo, con algunas categorías superpuestas? Luego, cntcat != 1, por lo que su cláusula HAVING no coincidirá aunque el archivo haya sido categorizado de la misma manera por varios usuarios.

En vez de ello utilizo una autocombinación:

SELECT a.MD5, a.CategoryPK 
FROM  Hash a 
    JOIN Hash b 
     ON a.MD5 = b.MD5 
    AND a.UserPK <> b.UserPK 
    AND a.CategoryPK = b.CategoryPK 
GROUP BY a.MD5, a.CategoryPK 
HAVING COUNT(DISTINCT a.UserPK) > 2 -- you said "more than 2" ? 
+0

Buen punto - ¡Acabo de verificar en una de mis tablas y encontré 10 archivos adicionales usando esta consulta! – user1395659

1

que no puedo ver ningún problema con lo que ha escrito, aparte de que no está recibiendo la categoría en su lista de selección que parece estar en el criterio? Creo que se podría simplificar un poco y obtener la categoría de cabo:

SELECT MD5, CategoryPK 
FROM Hash 
GROUP BY MD5, CategoryPK 
HAVING MIN(UserPK) <> MAX(UserPK) 

Alternativamente, usted podría mirar a resolver esto con una combinación, puede que tenga que realizar algunas pruebas y el uso de explicar, pero a veces se une a un mejor rendimiento que AGRUPAR POR. Vale la pena intentarlo de todos modos para ver si ves alguna diferencia significativa.

SELECT DISTINCT t1.MDF, t2.CategoryPK 
FROM Hash T1 
     INNER JOIN Hash T2 
      ON T1.MD5 = T2.MD5 
      AND T1.CategoryPK = T2.CategoryPK 
      AND T1.UserPK < T2.UserPK 
+0

+1 para ambas sugerencias (aunque si el OP realmente significaba "* más de dos usuarios diferentes *" como se describe en su texto, obviamente no darán el resultado deseado, pero según su intento, estoy de acuerdo en que probablemente quiso decir * al menos dos..*). Sin embargo, creo que su comentario de que no hay ningún problema con lo que escribió el OP es erróneo: vea mi observación al comienzo de mi respuesta. – eggyal

+0

Sí, tiene razón, me refiero a al menos dos y he corregido la pregunta. – user1395659

Cuestiones relacionadas