Domanda

Ho una query, che passerà attraverso una tabella degli ordini e, come sottosuolo, conterrà anche il numero di righe in un'altra tabella usando una chiave esterna.

SELECT eo.*, (
    SELECT COUNT(*)
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid
    AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'

Ora, sulla tabella ECOM_ORDER_ITEMS, ha un campo EOI_QUANTITY. Voglio che la query visualizzi il numero di prodotti per ciascun ordine, tenendo conto del campo della quantità.

SELECT eo.*, (
    SELECT COUNT(*) * eoi.eoi_quantity
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid
    AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'

Tuttavia, quando provo questo, mi dà solo lo stesso numero di prima. Per l'ordine su cui sto testando, ha 2 elementi, uno con quantità 1, l'altro con quantità come 10 e num_prod sta tornando come 2 su entrambe le query.

Qualche idea? :)

È stato utile?

Soluzione

Se il valore di eoi.eoi_quantity è costituito da più valori, 1 e 10, solo uno di essi verrà selezionato e moltiplicato per conteggio (*). Quindi stai ottenendo il risultato 1 * 2.

Come conteggio ( *) = 2 per due elementi, vuoi il risultato 2 * 1 + 2 * 10? Non mi sembra giusto. Sto pensando che tu voglia contare la quantità totale su tutti gli ordini pertinenti, quindi perché non usare la somma (eoi.eoi_quantity) per ottenere invece 1 + 10? Quindi avresti:

SELECT eo.*, (
    SELECT SUM(eoi.eoi_quantity)
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser';

Ma questo ti darà ancora lo stesso valore per ogni colonna. In effetti, una sottoquery come (seleziona eo.*, ...) comporterà un errore se restituisce più di una riga.

Ecco perché Johan ha suggerito di voler unirti ai tavoli. È necessario unire le tabelle per essere sicuro che le righe siano correttamente collegate e quindi raggrupparle dall'ID desiderato per ogni riga. Che ne dite di:

SELECT eo.*, SUM(eoi.eoi_quantity)
FROM ecom_orders eo JOIN ecom_order_items eoi ON eo.eo_id = eoi.eoi_parentid
WHERE eo.site_id = '1' 
AND eo_username = 'testuser'
GROUP BY eo.eo_id;

Altri suggerimenti

Riscrivi la query in:

SELECT eo.*, sum(eoi.eoi_quantity) as sales
FROM ecom_orders eo
INNER JOIN ecom_order_items eoi ON (eo.eo_id = eoi.eoi_parentid)
WHERE eo.site_id = '1' AND eoi.site_id = '1' AND eo_username = 'testuser'
GROUP BY eo.eo_id;

Perché il conteggio (*) per ogni singolo elemento è 1, count(*) * quantity equivale a sum(quantity).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top