none
Problema con consulta una tabla dos relaciones many to many RRS feed

  • Pregunta

  • Hola chic@s, un saludo lo primero. Tengo un problemilla con una consulta que no soy capaz de sacar. Estaría muy agradecido con cualquier pista gracias. No se porque solo me deja poner la imagen del diagrama de tablas debajo del comentario. Disculpen las molestias. Tengo una tablas donde almaceno platos, otra donde almacenos los menús del día y otras dos tablas donde almaceno el id del menú y los id's de los platos de primero y otra igual con los segundos. 

    SELECT Menus.Fecha, P1.DescripcionESP
    from Menus
    left join MenusPrimeros M1 on Menus.Id = M1.Menu
    left join Platos P1 on M1.Plato = P1.Id 
    Where Menus.Id = 1
    
    

    Esta consulta me devuelve es resultado correcto, que son los platos que hay de primero en un menú, mi problema surge cuando quiero saber los segundos también.

    SELECT Menus.Fecha, P1.DescripcionESP, P2.DescripcionESP	
    from Menus
    left join MenusPrimeros M1 on Menus.Id = M1.Menu
    left join MenusPrimeros M2 on Menus.Id = M2.Menu
    left join Platos P1 on M1.Plato = P1.Id 
    left join Platos P2 on M2.Plato = P2.Id

    He probado con esto y con unas cuantas mas, pero no soy capaz de encontrar la consulta adecuada. no quiero imaginar si además tengo que almacenar los postres y las bebidas.

    Muchas gracias, un saludo.

    Diagrama tablas:

    domingo, 9 de julio de 2017 6:55

Respuestas

  • La consulta que estás buscando es la siguiente:

    SELECT Menus.Fecha, P1.DescripcionESP, 'Primero' AS Orden
    FROMMenus
    LEFT JOIN MenusPrimeros M1 on Menus.Id = M1.Menu
    LEFT JOIN Platos P1 on M1.Plato = P1.Id 
    WHERE Menus.Id = 1
    UNION ALL
    SELECT Menus.Fecha, P1.DescripcionESP, 'Segundo' AS Orden
    FROM Menus
    LEFT JOIN MenusSegundos M2 on Menus.Id = M2.Menu
    LEFT JOIN Platos P1 on M1.Plato = P1.Id 
    WHERE Menus.Id = 1

    Sin embargo creo que las cosas serían más sencillas, si en vez de tener las tablas MenusPrimeros y MenusSegundos tuvieras la tabla PlatosMenus con las columnas Menu, Plato y Orden, donde el orden te dice si es un primero un segundo, un postre, una entrada o lo que sea.

    Aún así no creo que el modelo refleje la realidad, porque un plato tiene implícito el orden, por ejemplo unas lentejas o una sopa son primer plato siempre y una carne es siempre un segundo, a nadie se le ocurre poner de primero una carne y de segundo una sopa, por tanto el campo orden debería estar en la tabla Platos y la relación de los platos y los menús materializada por la tabla PlatosMenus con las columnas Menu y Plato sin el orden.

    • Marcado como respuesta aratar79 domingo, 9 de julio de 2017 7:55
    domingo, 9 de julio de 2017 7:38

Todas las respuestas

  • La consulta que estás buscando es la siguiente:

    SELECT Menus.Fecha, P1.DescripcionESP, 'Primero' AS Orden
    FROMMenus
    LEFT JOIN MenusPrimeros M1 on Menus.Id = M1.Menu
    LEFT JOIN Platos P1 on M1.Plato = P1.Id 
    WHERE Menus.Id = 1
    UNION ALL
    SELECT Menus.Fecha, P1.DescripcionESP, 'Segundo' AS Orden
    FROM Menus
    LEFT JOIN MenusSegundos M2 on Menus.Id = M2.Menu
    LEFT JOIN Platos P1 on M1.Plato = P1.Id 
    WHERE Menus.Id = 1

    Sin embargo creo que las cosas serían más sencillas, si en vez de tener las tablas MenusPrimeros y MenusSegundos tuvieras la tabla PlatosMenus con las columnas Menu, Plato y Orden, donde el orden te dice si es un primero un segundo, un postre, una entrada o lo que sea.

    Aún así no creo que el modelo refleje la realidad, porque un plato tiene implícito el orden, por ejemplo unas lentejas o una sopa son primer plato siempre y una carne es siempre un segundo, a nadie se le ocurre poner de primero una carne y de segundo una sopa, por tanto el campo orden debería estar en la tabla Platos y la relación de los platos y los menús materializada por la tabla PlatosMenus con las columnas Menu y Plato sin el orden.

    • Marcado como respuesta aratar79 domingo, 9 de julio de 2017 7:55
    domingo, 9 de julio de 2017 7:38
  • Si tienes razón, es mas fácil poner el orden en la tabla menusplatos. Gracias por tu respuesta voy a cambiar el modelo. Mal visto por mi parte.
    domingo, 9 de julio de 2017 7:58