simple y pregunta rápida, tengo esas tablas:combinación interna con count() en tres mesas
//table people
| pe_id | pe_name |
| 1 | Foo |
| 2 | Bar |
//orders table
| ord_id | pe_id | ord_title |
| 1 | 1 | First order |
| 2 | 2 | Order two |
| 3 | 2 | Third order |
//items table
| item_id | ord_id | pe_id | title |
| 1 | 1 | 1 | Apple |
| 2 | 1 | 1 | Pear |
| 3 | 2 | 2 | Apple |
| 4 | 3 | 2 | Orange |
| 5 | 3 | 2 | Coke |
| 6 | 3 | 2 | Cake |
Necesito tener una consulta una lista de todas las personas, contando el número de órdenes y la total de número de artículos, como que:
| pe_name | num_orders | num_items |
| Foo | 1 | 2 |
| Bar | 2 | 4 |
Pero no puedo hacer que funcione! Probé
SELECT
people.pe_name,
COUNT(orders.ord_id) AS num_orders,
COUNT(items.item_id) AS num_items
FROM
people
INNER JOIN orders ON (orders.pe_id = people.pe_id)
INNER JOIN items ON items.pe_id = people.pe_id
GROUP BY
people.pe_id;
Pero esto devuelve el num_*
valores incorrectos:
| name | num_orders | num_items |
| Foo | 2 | 2 |
| Bar | 8 | 8 |
me di cuenta de que si trato de unirse a una mesa al mismo tiempo, funciona:
SELECT
people.pe_name,
COUNT(orders.ord_id) AS num_orders
FROM
people
INNER JOIN orders ON (orders.pe_id = people.pe_id)
GROUP BY
people.pe_id;
//give me:
| pe_name | num_orders |
| Foo | 1 |
| Bar | 2 |
//and:
SELECT
people.pe_name,
COUNT(items.item_id) AS num_items
FROM
people
INNER JOIN items ON (items.pe_id = people.pe_id)
GROUP BY
people.pe_id;
//output:
| pe_name | num_items |
| Foo | 2 |
| Bar | 4 |
Cómo combinar esas dos consultas en una?
Sus tablas realmente necesitan reorganizarse. La tabla de artículos no debe hacer referencia a la tabla de pedidos y, desde luego, no a la tabla de personas, y necesita una nueva tabla para una relación de varios a muchos, como pedidos y artículos. –
¿Por qué necesitaría un número de muchos a muchos si un pedido solo puede pertenecer a una persona? Su modelo tiene perfecto sentido. –
@adam: no entiendo su sugerencia. Entonces, solo el ID inútil que veo es el pe_id en la tabla de elementos, pero tal vez podría ser útil en el futuro para obtener el total de elementos de un pueblo sin unirse a la tabla de pedidos. ¿Qué quiere decir con "La tabla de artículos no debe hacer referencia al pedido"? – Strae