Ver Mensaje Individual
  #4 (permalink)  
Antiguo 06/05/2016, 15:52
Avatar de mortiprogramador
mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 8 meses
Puntos: 214
Respuesta: Problema para hacer una consulta

Saludo.

Pues teniendo en cuenta lo que se plantea, tal vez la mejor manera
sería modificando un poco la base de datos, pero con lo que se tiene
puede sacarse haciendo lo siguiente:

1. Una consulta que haga el conteo de cada platillo por especialidad, y que solo nos retorne el conteo más alto (esto para luego sacar los platillos que tengan esa cantidad de conteo, pues pueden ser varios en caso de empates)
2. Usar la consulta del punto 1 como condición de una consulta más grande, en donde traiga todos los platillos de una determinada especialidad.
3. Usar la consulta del punto 2 para generar UNION SELECT cambiando en cada cual la especialidad a buscar.

Es decir, algo así:

Código SQL:
Ver original
  1. -- Consulta del punto 2
  2. SELECT e.nombre_especialidad, p.id_platillo, p.nombre_platillo, COUNT(c.id_platillo) vecesconsumidas
  3. FROM borrar_consumo c
  4. INNER JOIN alumno a ON c.id_alumno = a.id_alumno
  5. INNER JOIN especialidad e ON a.id_especialidad = e.id_especialidad
  6. INNER JOIN platillo p ON c.id_platillo = p.id_platillo
  7. WHERE e.id_especialidad = 1
  8. GROUP BY e.nombre_especialidad, c.id_platillo
  9. HAVING COUNT(c.id_platillo) =
  10. -- Consulta del punto 1
  11. (SELECT COUNT(c1.id_platillo)
  12. FROM consumo c1
  13. INNER JOIN alumno a1 ON c1.id_alumno = a1.id_alumno
  14. INNER JOIN especialidad e1 ON a1.id_especialidad = e1.id_especialidad
  15. WHERE e1.id_especialidad = 1
  16. GROUP BY c1.id_platillo
  17. ORDER BY COUNT(c1.id_platillo) DESC LIMIT 1)
  18. -- Consulta del punto 3, que es la misma del punto 2, con otra id_especialidad
  19. UNION
  20. SELECT e.nombre_especialidad, p.id_platillo, p.nombre_platillo, COUNT(c.id_platillo) vecesconsumidas
  21. FROM consumo c
  22. INNER JOIN alumno a ON c.id_alumno = a.id_alumno
  23. INNER JOIN especialidad e ON a.id_especialidad = e.id_especialidad
  24. INNER JOIN platillo p ON c.id_platillo = p.id_platillo
  25. WHERE e.id_especialidad = 2
  26. GROUP BY e.nombre_especialidad, c.id_platillo
  27. HAVING COUNT(c.id_platillo) =
  28. (SELECT COUNT(c1.id_platillo)
  29. FROM consumo c1
  30. INNER JOIN alumno a1 ON c1.id_alumno = a1.id_alumno
  31. INNER JOIN especialidad e1 ON a1.id_especialidad = e1.id_especialidad
  32. WHERE e1.id_especialidad = 2
  33. GROUP BY c1.id_platillo
  34. ORDER BY COUNT(c1.id_platillo) DESC LIMIT 1)
  35. ................

Cómo resultado, se obtendrá lo siguiente:

Código HTML:
Ver original
  1. nombre_especialidad     id_platillo     nombre_platillo     vecesconsumidas
  2. Aplicaciones                         9                     sopa                 6
  3. Bases de datos                     9                     sopa                 2
  4. Desarrollo                             9                     sopa                 2
  5. Moviles                                 9                     sopa                 2    
  6. Moviles                                 1                     pasta                 2
  7. Sistemas Operativos                 1                     pasta                 3
  8. Desarrollo                             10                 fruta                     2
  9. Desarrollo                             6                     ensalada roja     2
  10. Bases de datos                     7                     ensalada fria         2
  11. Bases de datos                     2                     arroz                 2

Y como se puede ver, pues hay empate en especialidades
y algunos platillos (Por ej en Moviles la sopa y la pasta)

Espero sirva la idea.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com