我有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
更新2
似乎唯一的方法是将part_id的一部分保存在报价表中并按其分组
答案 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