Tengo una configuración de 3 mesas (Sucursales, Producto y Residuos). El objetivo es obtener un resultado que incluya todas las sucursales habilitadas, con todos los productos habilitados y sus desperdicios durante toda la semana
Tabla: Sucursales
| identificación | Nombre de la sucursal | Está habilitado |
|---|---|---|
| 1 | rama grande | 1 |
| 2 | Rama Mediana | 0 |
| 3 | Rama pequeña | 1 |
Tabla: Residuos
| identificación | Identificación de la sucursal | ID del Producto | Número de la semana | Lun | martes | casarse | Jue | Vie | Se sentó | sol |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 30 | 10 | 0 | 5 | 0 | 0 | 0 | 0 |
Tabla: Producto
| identificación | Nombre | Está habilitado |
|---|---|---|
| 1 | Pan | 1 |
| 2 | Crema | 1 |
| 3 | Arroz | 1 |
| 4 | Leche | 0 |
Resultado ideal
| residuos.id | identificación de la sucursal | ramas.nombre | Número de la semana | ID del Producto | nombre del producto | Lun | martes | casarse | Jue | Vie | Se sentó | sol |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | rama grande | 30 | 1 | Pan | 10 | 0 | 5 | 0 | 0 | 0 | 0 |
| nulo | 1 | rama grande | nulo | 2 | Crema | nulo | nulo | nulo | nulo | nulo | nulo | nulo |
| nulo | 1 | rama grande | nulo | 3 | Arroz | nulo | nulo | nulo | nulo | nulo | nulo | nulo |
| nulo | 3 | Rama pequeña | nulo | 1 | Pan | nulo | nulo | nulo | nulo | nulo | nulo | nulo |
| nulo | 3 | Rama pequeña | nulo | 2 | Crema | nulo | nulo | nulo | nulo | nulo | nulo | nulo |
| nulo | 3 | Rama pequeña | nulo | 3 | Arroz | nulo | nulo | nulo | nulo | nulo | nulo | nulo |
Intento de consulta SQL
SELECT waste.id, product.id, product.name, product.is_enabled waste.product_id, waste.id, week_number, waste.branch_id, branches.id, branches.branch_name, branches.is_enabled, mon, tue, wed, thu, fri, sat, sun FROM `product` LEFT JOIN waste ON product.id = waste.product_id LEFT JOIN branches;¿Qué tipo de unión se debe utilizar para lograr este resultado?
Frist CROSS JOIN dos tablas maestras (sucursal y producto) y recupere solo la sucursal y el producto habilitados y use este resultado como subconsulta . Luego, a la izquierda, únase a la tabla de desechos con la subconsulta para obtener el resultado deseado.
-- MySQL SELECT w.id wast_id, t.branch_id , t.branch_name, w.week_number , t.product_id, t.product_name , w.mon, w.tues, w.wed, w.thu , w.fri, w.sat, w.sun FROM (select b.id branch_id , b.branch_name , p.id product_id , p.name product_name from Branches b cross join Product p where b.is_enabled = 1 and p.is_enabled = 1) t left join Waste w on t.branch_id = w.branch_id and t.product_id = w.product_id order by t.branch_id, t.product_id;Consulte esta URL https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=4a25c2ce1f1af6729a0cfe34d8998eb6