[英]How get a sorted list combined with group
我尝试获取按组排序的产品组列表。 我的问题是,我只需要将一个产品分成一组即可使用(0 =否,1 =是),并且价格最低且金额大于0。
select id, group_id, price, amount, available from products
Table rows:
id group_id price amount available
1 1 100 1 1
2 1 50 1 1
3 1 25 1 0
4 2 100 2 1
5 2 200 1 1
6 2 100 2 1
7 2 50 1 1
我需要ID为2和7的行作为结果。 我的问题是,到group_id中,有多个价格相同的ID。
有没有解决此问题的想法吗?
这是ANSI标准,应返回您想要的内容。 如果有多个符合条件的行(即具有相同的最小价格),它将仅返回第一个(较低的ID)。
SELECT MIN(P.id), P.group_id, P.price, P.amount, P.available
FROM products P
INNER JOIN
(SELECT group_id, MIN(price) AS minprice
FROM products
WHERE available=1 AND amount > 0
GROUP BY group_id
) G ON P.group_id = G.group_id AND P.price = G.minprice
GROUP BY P.group_id, P.price, P.amount, P.available
ORDER BY P.group_id
请注意,如果您有一个大表,则可能需要对价格列进行索引(或组合索引group_id + price)
在其他支持窗口功能的RDBMS上会更简单
您可以在GROUP BY上使用HAVING子句和MIN ,如下所示:
CREATE TABLE products (
id INT PRIMARY KEY NOT NULL,
group_id INT NOT NULL,
price INT NOT NULL,
amount INT NOT NULL,
available INT NOT NULL
);
INSERT INTO products (id, group_id, price, amount, available) VALUES (1, 1, 100, 1, 1);
INSERT INTO products (id, group_id, price, amount, available) VALUES (2, 1, 50 , 1, 1);
INSERT INTO products (id, group_id, price, amount, available) VALUES (3, 1, 25 , 1, 0);
INSERT INTO products (id, group_id, price, amount, available) VALUES (4, 2, 100, 2, 1);
INSERT INTO products (id, group_id, price, amount, available) VALUES (5, 2, 200, 1, 1);
INSERT INTO products (id, group_id, price, amount, available) VALUES (6, 2, 100, 2, 1);
SELECT id, group_id, price, amount, available FROM products;
SELECT id, group_id, price, amount, available
FROM products
WHERE amount > 0
AND available = 1
GROUP BY group_id HAVING min(price);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.