【问题标题】:MySQL Group By Product Id BUT NOT Product that has a Serial NumberMySQL 按产品 ID 分组,但不是具有序列号的产品
【发布时间】:2014-07-12 03:07:19
【问题描述】:

有人可以帮助我如何为此进行有效的 mysql 查询吗?

我需要查询所有订购商品的总数量。

结合。

我需要查询所有收到的物品的总数量。

请注意,在我的“received_po_details”表中,有些产品在收到时有序列号,而有些则没有。这就是我遇到问题的地方,因为收到的总和由于序列号而增加了一倍。

表:received_po_details

i_rpoh_id   i_p_id  i_quantity_received s_product_serial
1           1       100 
1           2       100 
1           3       50  
1           4       25  
1           7       100 
1           8       50  
1           6       1                   XYZ1
1           6       1                   XYZ2
1           5       1                   ABC1
1           5       1                   ABC2

现在我有这两个需要组合的单独的 sql。 如果可能,我不想为此使用 Union 语句...

--获取订购的总数量

SELECT
    products.i_id AS 'ID',
    products.s_name AS 'Name',
    COALESCE(SUM(purchase_order_details.i_quantity_ordered),0) AS 'Total Quantity Ordered'
FROM
    products
LEFT JOIN
    purchase_order_details
    ON
    products.i_id = purchase_order_details.i_p_id
GROUP BY
    products.i_id   

-- to get the Total Quantity Received
SELECT
    products.i_id AS 'ID',
    products.s_name AS 'Name',
    COALESCE(SUM(received_po_details.i_quantity_received),0) AS 'Total Quantity Received'
FROM
    products
LEFT JOIN
    received_po_details
    ON
    products.i_id = received_po_details.i_p_id
GROUP BY
    products.i_id

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您可以通过创建派生表或每种类型的总和来组合这些查询(在下面的查询中,它们被命名为 t1t2)并将派生表连接到主产品表。

    SELECT
        p.i_id AS 'ID',
        p.s_name AS 'Name',
        COALESCE(t1.total,0) 'Total Quantity Ordered',
        COALESCE(t2.total,0) 'Total Quantity Received'
    FROM products p
    LEFT JOIN (
        SELECT 
            pod.i_p_id,
            SUM(pod.i_quantity_ordered) total
        FROM purchase_order_details pod
        GROUP BY pod.i_p_id
    ) t1 ON t1.i_p_id = p.i_id
    LEFT JOIN (
        SELECT 
            rpd.i_p_id,
            SUM(rpd.i_quantity_received) total
        FROM received_po_details rpd
        GROUP BY rpd.i_p_id
    ) t2 ON p.i_id = t2.i_p_id
    

    【讨论】:

    • 嗨 FuzzyTree,你做了什么,但我有一些问题,因为我是这方面的新手.. :) - 这个 sql 是否同时运行 3 个查询? - 这会损害查询速度和带宽方面吗? - 如果我们希望每次分页显示数百个数据,这个查询会是选择吗? - 我不明白你用left join和t1和t2做了什么样的sql语句,这是什么样的sql语句,所以我可以研究和研究更多。谢谢
    • @anonymousmetoyou 即使有 3 个 SELECT 子句,它们都是 1 个查询的一部分。 t1t2 被称为 derived tables。例如,t1 是一个 derived table,由 2 列组成,即产品 ID 和订购的总数量。我相信这是对您要查找的数据的最快查询,并且它适用于分页(只需在末尾添加 LIMITOFFSET 子句以选择特定页面)
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多