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
vsASC
时,结果集如何会有所不同?为什么不只是不同订单中的相同行?@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