2011-06-05 28 views
6

Complejo para mí ya que soy novato en SQL.consulta SQL compleja, muchos a muchos

Tengo tres tablas - Peoples, Interests y Peoples_Interests (muchos-a-muchos) - que están conectados de la siguiente manera:

People tiene muchas Interests través Peoples_Interests
Interest tiene muchas Peoples través Peoples_Interests

Necesito proponer sugerencias a los Pueblos con Pueblos más similares a ellos, que se basa en la cantidad de Intereses similares. Entonces para ejemplo:

Me interesa béisbol, fútbol y voley. Debería obtener una sugerencia con otro usuario que tenga tantos intereses similares como sea posible. Las personas con 3/3 ocurrencias deben ser lo que necesito si existen (si no, 2/3 y tal).

Por lo tanto, necesito una consulta que la salida consistirá en ordenados por intereses similares Pueblos.

ACTUALIZACIÓN: Db estructura:

intereses
id
nombre - cadena

Pueblos
Identificación
correo electrónico

Peoples_Interests
interests_id
peoples_id

Gracias.

+0

Sería easer si publicado el diseño de la mesa en detalle. – Hogan

Respuesta

3

Algo como esto.

Select people.id, people.name, count(interest.id) 
from people 
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id 
where interests.id in (select id from interests where interests.peopleid = @inputuserid) 
group by people.id, people.name 
order by count(interest.id) 

En Inglés (que puede o no puede hacerlo más claro.)

  • Seleccione el nombre de la persona y el número de intereses que comparten
  • De la tabla personas
  • Únete a los intereses tabla tal que esa tabla
  • es solo los intereses de la persona que estamos tratando de emparejar.
  • (grupo de gente
  • y el orden por el número de intereses que coinciden.)

actualizarse sin la consulta sub pero menos claro

Select people.id, people.name, count(interest.id) 
from people 
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id 
inner join interest i2 on (interests.id = i2.id and i2.people_id = @inputuserid) 
group by people.id, people.name 
order by count(interest.id) 
+0

que seleccione va a ejecutarse muy lentamente en MySQL. Lo reemplazaría con un 'interés de unión interna i2 on (interests.id = i2.id e i2.people_id = @inputuserid) ' – Johan

+0

@johan, sí, debería actualizarse para no utilizar una subconsulta, pero estaba tratando de aclararle. – Hogan

+0

Veo la comprensibilidad PoV así que +1. – Johan

Cuestiones relacionadas