MySQL - 关于多对多关系的总和

时间:2017-04-19 06:25:51

标签: mysql

我有以下两个表:

ORDERS_ENTRIES

orders_id | products_id | entry_id | quantity
1111 | 14492 | 1 | 1
1112 | 14492 | 1 | 3

PRODUCT_STOCKS

products_id | entry_id | quantity
14492 | 1 | 4
14492 | 1 | 2

我试图通过以下查询找出SUM(ORDERS_ENTRIES.quantity)以及products_stocks的数量:

SELECT 
    oe.entry_id as entry,
    SUM(oe.quantity) as qty,
    ps.quantity as ps_qty
FROM
    ORDERS_ENTRIES oe
    INNER JOIN
        PRODUCT_STOCKS ps
            ON 
                oe.entry_id = ps.entry_id;
WHERE
    oe.products_id = 14492;
GROUP BY
    ps.entry_id;

但由于多对多关系,返回的结果会多次计算金额。

预期答案:

oe.entry_id | oe.quantity | ps.quantity
1 | 4 | 4
1 | 4 | 2

但我得到以下答案:

oe.entry_id | oe.quantity | ps.quantity
1 | 8 | 4
1 | 8 | 2

我该怎么做?

2 个答案:

答案 0 :(得分:1)

通过观察,您似乎希望首先按ORDERS_ENTRIES汇总entry_id表中的数量,然后将此结果加入PRODUCT_STOCKS表:

SELECT oe.entry_id,
       oe.qty,
       ps.quantity AS ps_qty
FROM
(
    SELECT entry_id, SUM(quantity) AS qty
    FROM ORDERS_ENTRIES
    GROUP BY entry_id
) oe
INNER JOIN PRODUCT_STOCKS ps
    ON oe.entry_id = ps.entry_id

<强>输出:

enter image description here

在这里演示:

Rextester

答案 1 :(得分:0)

这是因为连接表中有多个匹配记录。您可以避免在子查询中使用group by复制

SELECT 
    oe.entry_id as entry,
    oe.qty,
    ps.quantity as ps_qty
FROM
  (SELECT entry_id, SUM(quantity) as qty  FROM ORDERS_ENTRIES GROUP BY  entry_id) AS oe
    INNER JOIN
        PRODUCT_STOCKS ps
            ON 
                oe.entry_id = ps.entry_id;
WHERE
    oe.products_id = 14492;
GROUP BY
    ps.entry_id;