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

Mysql 获取按两列分组的最小/最大值,mysql,Mysql,我有两张桌子 零件表: id | part_id | group_id 1 | | 1 2 | 1 | 1 3 | | 1 4 | | 2 每个部件都与组相关,并且可以与另一个部件相关(模拟) 报价表: offer_id | part_id | quantity 1 | 1 | 1 2 | 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
每个报价都与零件相关

我需要获得按零件分组的最佳报价或按最低/最高数量订购的相关零件

对于组id 1,在排序时,ASC结果应为

offer_id | part_id | quantity
       1 |       1 |        1
       4 |       3 |        4
offer_id | part_id | quantity
       4 |       3 |        4
       3 |       2 |        3
订购时,应显示DESC结果

offer_id | part_id | quantity
       1 |       1 |        1
       4 |       3 |        4
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行而不是两行。我怎么修理它

更新

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

id | part_id | group_id
 1 |       1 |        1
 2 |       1 |        1
 3 |       3 |        1
 4 |       4 |        2
我也尝试了这个查询,但它也没有按part\u 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

更新2


似乎唯一的方法是将零件id保存在报价表中,并按其分组

我认为这是不可能的,因为只有as订购您无法实现这一点。 正如您在小提琴示例中所看到的,您还必须添加一个,并且p.part\u id为NULL

最小值(pi.报价id)|零件id | q ---------------: | ------: | -: 1 | 1 | 1 4 | 3 | 4
dbfiddle

我认为这是不可能的,因为只有使用as顺序,您无法实现这一点。 正如您在小提琴示例中所看到的,您还必须添加一个,并且p.part\u id为NULL

最小值(pi.报价id)|零件id | q ---------------: | ------: | -: 1 | 1 | 1 4 | 3 | 4
DBFIDLE

我无法添加p。part_id为空,因为我需要part 1和part 2之间的最佳报价(因为2与part 1相关),正如我所说的,我看不到解决您问题的方法,因为我可以通过对数据进行排序(取最低值和最高值)来获得最小值和最大值,但我看不出在2和3的情况下,它们不是任何东西的最大值和最小值。我不能添加p。part_id为空,因为我需要第1部分和第2部分之间的最佳报价(因为与2相关的1),就像我说的,我看不到你的问题的解决方案,因为我可以通过对数据进行排序来获得最小值和最大值,但我看不出,在2和3的情况下,它们不是任何事物的最大值和最小值。在排序
DESC
vs
ASC
时,结果集如何会有所不同?为什么不只是不同订单中的相同行?@Nick不一样,因为当asc订单我选择最低数量的报价时,当desc-HIGHEST时,当订购
desc
asc
时,结果集如何不同?为什么不只是不同订单中的相同行?@Nick不一样,因为当asc订单时,我选择数量最低的报价,而desc-最高的报价
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