Combinación compleja para seleccionar solo dos sujetos

Estoy haciendo un proyecto en MySQL. tengo un problema con un join.

+---+-----------+-----------+
|id | name      | elective  |
+---+-----------+-----------+
| 1 | Jone      | Math      |
| 2 | Jane      | Math      |
| 3 | Doe       | Math      | 
| 4 | Bloggs    | Math      |
| 5 | Peter     | Math      | 
| 6 | Chris     | Math      | 
| 7 | Mark      | Math      | 
| 3 | Doe       | Physics   | 
| 4 | Bloggs    | Physics   |
| 5 | Peter     | Physics   | 
| 6 | Chris     | Physics   | 
| 7 | Mark      | Physics   | 
| 5 | Peter     | Chemistry | 
| 6 | Chris     | Chemistry | 
| 7 | Mark      | Chemistry | 
+---+-----------+-----------+

En la tabla anterior pocas personas han elegido más de dos materias y otras pocas sólo dos materias. Y otros han elegido un solo tema.

Pero quiero mostrar solo el segundo, es decir, personas que han tomado solo dos temas. Esto lo quiero obtener usando una combinación interna.

preguntado el 12 de junio de 12 a las 15:06

¿Por qué alguien arruinaría una buena edición mía? Ahora se ve terrible. -

Corrija la estructura de la tabla. Los datos se pueden interpretar de más de 1 manera :( -

2 Respuestas

select id, name from tablename
group by id, name
having count (elective) = 2

Usando solo joins como OP solicitado:

select t1.id, t1.name
from tablename t1
inner join tablename t2 on t2.id = t1.id and t2.name = t1.name and t2.name <> t1.name
left outer join tablename t3 on t3.id = t2.id and t3.name <> t1.name and t3.name <> t2.name
where t3.name is null

Mesas t1 y t2 seleccione dos diferentes electives por lo mismo id/person. Mesa t3 seleccionará otro elective. Cuando pongo en el where cláusula que quiero el t3.name para ser NULL quiere decir que no existe un tercero elective diferentes a las seleccionadas anteriormente.

Si existe un tercero el where la cláusula eliminará esos names.

Los dos inner joins están presentes para select al menos dos diferentes electives.

Respondido el 12 de junio de 12 a las 17:06

Y no te ofendas, pero tu consulta tampoco funcionará, porque puede haber dos personas con el mismo nombre. - Andrius Naruševičius

Me alegro de haber estado de acuerdo en que la estructura de la mesa es terrible y necesita arreglos. - Andrius Naruševičius

Por cierto, solo pon otro 6 Mark Math en la tabla y su consulta se destruye :) Debe agruparse en identificaciones y no en nombres de personas. No tiene sentido. - Andrius Naruševičius

Ahora que lo veo, tu consulta es correcta. Él tiene la misma identificación para la misma persona. - AF.

@balamurugan por que quieres asi? - AF.

SELECT id, name, COUNT(elective) FROM table GROUP BY id, name HAVING COUNT(elective) = 2

Respondido el 12 de junio de 12 a las 15:06

Bueno, es el problema de la persona que hizo la tabla, que no se ajusta a la clase 3 de la estructura DB y debe repensarse de inmediato. Obviamente debería contener sólo person_id, subject_id y tener claves foráneas. - Andrius Naruševičius

El tuyo es más incorrecto que el mío, pero tengo las desventajas porque tengo una reputación más baja. Parece justo :/ - Andrius Naruševičius

que les parece mi nueva consulta :P - AF.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.