2008-10-29 14 views
5

Podemos etiquetar una pregunta con varias etiquetas en el sitio web de StackOverflow, me pregunto cómo encontrar las preguntas más relacionadas con las etiquetas comunes.Cómo encontrar los registros con las etiquetas más comunes, como las preguntas relacionadas en StackOverflow

Supongamos que tenemos 100 preguntas en una base de datos, cada pregunta tiene varias etiquetas. Supongamos que el usuario está navegando una pregunta específica y queremos que el sistema muestre las preguntas relacionadas en la página. El criterio para la pregunta relacionada es que tienen las etiquetas más comunes.

Por ejemplo: La pregunta 1 está etiquetada con AAA, BBB, CCC, DDD, EEE.

La pregunta 2 está relacionada con los primeros 1 porque también tiene todas esas 5 etiquetas. La pregunta 3 está relacionada con las 2 principales porque tiene solo 4 o 3 etiquetas que tiene Questio1. ......

Así que mi pregunta es cómo diseñar la base de datos y descubrir rápidamente las preguntas relacionadas con la Pregunta 1. Muchas gracias.

Respuesta

0

No estoy del todo seguro de lo que quiere decir, pero the Tags page enumera las etiquetas en orden de popularidad (como en la cantidad etiquetada).

Editar: esto es sobre SO o sobre su propia aplicación? Si se trata de su propia aplicación, elimine la etiqueta SO ya que es un poco engañosa.

Edit2: diría algo como:

SELECT * FROM `questions` WHERE `tag` LIKE '%tagname%' OR (looped for each tag) LIMIT 5,0 

donde 5 es el máximo resultado que desea devolver (por lo menos alguna optimización). Probablemente no sea la mejor solución, pero podría ver que funciona.

Es posible que también desee probar una coincidencia LIKE utilizando el título.

9

Tal vez algo como:

select qt.question_id, count(*) 
from question_tags qt 
where qt.tag in 
(select qt2.tag 
    from question_tags qt2 
    where qt2.question_id = 123 
) 
group by qt.question_id 
order by 2 desc 
3

Si se puede garantizar que no se duplican las etiquetas de una pregunta, entonces usted puede hacer lo siguiente: singularidad

SELECT 
    QT2.question_id, 
    COUNT(*) AS cnt 
FROM 
    Question_Tags QT1 
INNER JOIN Question_Tags QT2 ON QT2.tag = QT1.tag AND QT2.question_id <> QT1.question_id 
WHERE 
    QT1.question_id = @question_id 
GROUP BY 
    QT2.question_id 
ORDER BY 
    cnt DESC 

Si no puede garantizar de etiquetas dentro de una pregunta, entonces la solución de Tony Andrews funcionará. El suyo funcionará en cualquier caso, pero debe comparar el rendimiento de su sistema con este método si puede garantizar la exclusividad mediante restricciones.

Cuestiones relacionadas