2010-08-14 17 views
5

Tengo 2 tablas, 'intereses' y 'users_interests'.Cómo contar intereses similares en MySQL

'users_interests' tiene solo userid y interestid campos. 'intereses solo tiene un id y un name.

Simplemente necesito encontrar ID de usuario que tengan más de 3 ID de interés en común. Me han dicho que se trata de un Self Join, pero parece que no puedo hacer que esto funcione.

Alguien dijo algo como esto podría funcionar:

SELECT 
     others.userid 
    FROM interests AS user 
    JOIN interests AS others 
     USING(interestid) 
    WHERE user.userid = 2 
    GROUP BY 
     others.userid 
    ORDER BY COUNT(*) DESC 

pero estoy teniendo ninguna suerte con él.

Respuesta

5
SELECT ui.userid, COUNT(*) AS common_interests 
FROM users_interests ui 
WHERE ui.interestid IN (
    SELECT ui2.interestid FROM users_interests ui2 WHERE ui2.userid = 2 
) 
AND ui.userid <> 2 
GROUP BY ui.userid 
HAVING common_interests > 3; 

nota la aparición de la userid estamos basando nuestra búsqueda en (2) en dos lugares en el código

+0

increíble! ¡Gracias por esto, esto funciona maravillosamente! – Ryan

2

Has dicho más de 3 identificaciones de interés en común, ¿quieres decir "al menos 4", ¿verdad?

SELECT first1.userid, second1.userid 
FROM users_interests first1, users_interests second1, 
    users_interests first2, users_interests second2, 
    users_interests first3, users_interests second3, 
    users_interests first4, users_interests second4 
WHERE 
    first2.userid=first1.userid AND first3.userid=first1.userid AND first4.userid=first1.userid AND 
    second2.userid=second1.userid AND second3.userid=second1.userid AND second4.userid=second1.userid AND 
    first1.userid<>second1.userid AND 
    first1.interestid=second1.interestid AND 
    first2.interestid=second2.interestid AND first2.interestid<>first1.interestid AND 
    first3.interestid=second3.interestid AND first3.interestid<>first2.interestid AND first3.interestid<>first1.interestid AND 
    first4.interestid=second4.interestid AND first4.interestid<>first3.interestid AND first4.interestid<>first2.interestid AND first4.interestid<>first1.interestid 

Ya que no he probado esto, recuerde que puede haber errores en ella, por lo que sólo lo use si usted lo entiende.

Si necesita lo mismo para otros números de intereses en común, estoy seguro de que puede escribir código para generar dinámicamente esta consulta para cualquier número. Además, si necesita los nombres de interés, estoy seguro de que podrá agregar las cuatro uniones necesarias a la tabla interests y agregar las columnas relevantes a la cláusula SELECT.

Cuestiones relacionadas