获取按两列分组的最小/最大

时间:2019-12-05 23:53:29

标签: mysql

我有2张桌子

零件表:

id | part_id | group_id
 1 |         |        1
 2 |       1 |        1
 3 |         |        1
 4 |         |        2

每个部分都与组相关,并且可以与另一个部分(模拟)相关

要价表:

offer_id | part_id | quantity
       1 |       1 |        1
       2 |       2 |        2
       3 |       2 |        3
       4 |       3 |        4
       5 |       4 |        5

每个与零件相关的报价

我需要获得按零件或其相关零件按最低/最高数量排序的最佳报价。

对于group_id 1,订购的ASC结果应为

offer_id | part_id | quantity
       1 |       1 |        1
       4 |       3 |        4

订购的DESC结果应为

offer_id | part_id | quantity
       4 |       3 |        4
       3 |       2 |        3

我尝试了此查询

SELECT 
         pi.offer_id, 
         pi.part_id,
         ( SELECT   pps.quantity
           FROM     offers AS pps
           WHERE    pps.offer_id = pi.offer_id
           ORDER BY pps.quantity asc
           LIMIT    1
         ) AS q
FROM offers AS pi
JOIN parts p ON p.id = pi.part_id
WHERE p.group_id = 1
GROUP BY part_id
ORDER BY q asc

结果:

offer_id | part_id | q
       1 |       1 | 1
       2 |       2 | 2
       4 |       3 | 4

它不对零件和相关零件(1和2)进行分组,并且返回3行而不是2行。我该如何解决?

更新

是否可以将零件表数据更改为此?

id | part_id | group_id
 1 |       1 |        1
 2 |       1 |        1
 3 |       3 |        1
 4 |       4 |        2

我也尝试了此查询,但它也没有按part_id分组

SELECT a.id, a.part_id, a.quantity, p.part_id AS pid
FROM   supplier_offers a
INNER JOIN
(
    SELECT   part_id, Min(quantity) AS qty
    FROM     supplier_offers
    GROUP BY part_id
) b ON a.part_id = b.part_id AND a.quantity = b.qty
JOIN parts p ON p.id = a.part_id
WHERE p.cross_group_uuid = '78242c22-c113-4258-806c-936de014ba10'
ORDER BY a.quantity ASC

Result from real db

更新2

似乎唯一的方法是将part_id的一部分保存在报价表中并按其分组

1 个答案:

答案 0 :(得分:0)

我认为这是不可能的,因为仅凭订购就无法实现。 如您在小提琴示例中所见,您还必须添加并且p.part_id为NULL

CREATE TABLE offers
    (`offer_id` int, `part_id` int, `quantity` int)
;

INSERT INTO offers
    (`offer_id`, `part_id`, `quantity`)
VALUES
    (1, 1, 1),
    (2, 2, 2),
    (3, 2, 3),
    (4, 3, 4),
    (5, 4, 5)
;
✓

✓
CREATE TABLE parts
    (`id` int, `part_id` int, `group_id` int)
;

INSERT INTO parts
    (`id`, `part_id`, `group_id`)
VALUES
    (1, NULL, 1),
    (2, 1, 1),
    (3, NULL, 1),
    (4, NULL, 2)
;
✓

✓
SELECT 
  o.offer_id,o.part_id, o.quantity
FROM offers o
inner JOIN parts p 
ON p.id = o.part_id
WHERE group_id = 1 and p.part_id is NULL
offer_id | part_id | quantity
-------: | ------: | -------:
       1 |       1 |        1
       4 |       3 |        4
SELECT *
FROM
(SELECT 
  o.offer_id,o.part_id, o.quantity
FROM offers o
inner JOIN parts p 
ON p.id = o.part_id
WHERE group_id = 1
ORDER  by quantity
LIMIT 1) t1
union ALL
(SELECT 
  o.offer_id,o.part_id, o.quantity
FROM offers o
inner JOIN parts p 
ON p.id = o.part_id
WHERE group_id = 1
ORDER  by quantity DESC
LIMIT 1) 
offer_id | part_id | quantity
-------: | ------: | -------:
       1 |       1 |        1
       4 |       3 |        4
SELECT 
  o.offer_id,o.part_id, o.quantity
FROM offers o
inner JOIN parts p 
ON p.id = o.part_id
WHERE group_id = 1
ORDER BY o.offer_ID DESC
LIMIT 2
offer_id | part_id | quantity
-------: | ------: | -------:
       4 |       3 |        4
       3 |       2 |        3
SELECT 
  o.offer_id,o.part_id, o.quantity
FROM offers o
inner JOIN parts p 
ON p.id = o.part_id
WHERE group_id = 1 and p.part_id is NULL
ORDER BY o.offer_ID ASC
LIMIT 2
offer_id | part_id | quantity
-------: | ------: | -------:
       1 |       1 |        1
       4 |       3 |        4
SELECT 
         MIN(pi.offer_id), 
         pi.part_id,
        MIN( ( SELECT   pps.quantity
           FROM     offers AS pps
           WHERE    pps.offer_id = pi.offer_id
           ORDER BY pps.quantity DESC
           LIMIT    1
         )) AS q
FROM offers AS pi
JOIN parts p ON p.id = pi.part_id
WHERE p.group_id = 1 and p.part_id IS  NULL
GROUP BY part_id
ORDER BY q asc
MIN(pi.offer_id) | part_id |  q
---------------: | ------: | -:
               1 |       1 |  1
               4 |       3 |  4

db <>提琴here

相关问题