2013-05-27 17 views
8

Ho una tabella per "rami", "ordini" e "prodotti. Ogni ordine e prodotto sono collegati a un ramo con branch_id. Ho bisogno di una istruzione sql per ottenere un elenco di tutti i rami con un campo per quanti ordini e un campo per il numero di prodottisql selezionare il conteggio di più relazioni con join sinistro

questo funziona:.

SELECT b.*, COUNT(o.id) AS orderCount FROM branches b LEFT JOIN orders o ON (o.branch_id = b.id) GROUP BY b.id

ma ottiene solo la quantità di ordini, non prodotti Se cambio di esso. per aggiungere quantità di prodotti, gli importi sono sbagliato, perché si sta facendo quantità di ordini * quantità di prodotti.

Come posso ottenere la quantità di ordini e prodotti nella stessa istruzione SQL?

risposta

10

Qualcosa del genere dovrebbe funzionare (su un server SQL, almeno - non è stato specificato il motore).

SELECT 
    b.id 
    ,COUNT(distinct o.id) AS orderCount 
    ,COUNT(distinct p.id) AS productCount 
FROM branches b 
LEFT JOIN orders o 
    ON (o.branch_id = b.id) 
left join products p 
    on p.product_id=b.id) 
GROUP BY 
    b.id 
5

Si prega di provare:

select 
    *, 
    (select COUNT(*) from Orders o where o.branch_id=b.id) OrderCount, 
    (select COUNT(*) from Products p where o.branch_id=p.id) ProductCount 
From 
    branches b 
+1

questa soluzione è più flessibile perché si può mettere tutte le vostre condizioni nello stesso tempo per ottenere il conteggio di elementi specifici, grazie – CIRCLE

+0

subquery come questo sono un pendio scivoloso. È possibile rendere il codice molto lento molto rapidamente. – Dan

Problemi correlati