我有两张 table
Products
id, name, last_updated
1, Computer table, 2014-07-20 09:00:00
2, Fruits basket, 2014-07-21 09:00:00
3, Hard Disk, 2014-07-22 09:00:00
Products_prices
id, product_id, min_price, max_price, description
1, 1, 10.00, 20.00, glass top
2, 1, 40.00, 80.00, hard wood
3, 1, 5.00, 10.00, pvc
4, 2, 15.00, 30.00, Mangoes only
5, 3, 30.00, 60.00, 1 TB
6, 3, 45.00, 90.00, 2 TB
7, 3, 20.00, 40.00, 500 GB
我需要检索如下信息
product.id, product.name, product_prices.min_price, product_prices.max_price, price_diff_percentage ( calculated as round((max_price-min_price)/max_price*100) )
如果我做一个 LEFT JOIN,例如
SELECT *, round((max_price-min_price)/max_price*100) price_diff_pct
FROM products p LEFT JOIN Product_prices pp on pp.product_id = p.id
然后我得到包含所有产品价格行的产品列表,例如
1, computer table, 10.00, 20.00, 50, glass top
1, computer table, 40.00, 80.00, 50, hard wood
1, computer table, 5.00, 10.00, 50, pvc
2, fruits basket, 15.00, 30.00, mangoes only
3, hard disk, 30.00, 60.00, 50 1 TB
3, hard disk, 45.00, 90.00, 50 2 TB
3, hard disk, 20.00, 40.00, 50 500 GB
我希望将其更改为返回具有最低最低价格和 price_diff_pct 的产品行,例如而不是上面的返回集,它返回下面的
1, computer table, 5.00, 10.00, 50, pvc
2, fruits basket, 15.00, 30.00, mangoes only
3, hard disk, 20.00, 40.00, 50 500 GB
我需要在 last_updated 日期之前订购。
我该怎么做?
更新:
create table products (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(300) NOT NULL,
`last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO products (1, 'Computer table', '2014-07-20 09:00:00');
INSERT INTO products (2, 'Fruits basket', '2014-07-21 09:00:00');
INSERT INTO products (3, 'Hard Disk', '2014-07-22 09:00:00');
CREATE TABLE IF NOT EXISTS `product_prices` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL,
`min_price` float(10,2) NOT NULL,
`max_price` float(10,2) NOT NULL,
`description` varchar(300) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO product_prices (1, 1, '10.00', '20.00', 'glass top');
INSERT INTO product_prices (2, 1, '40.00', '80.00', 'hard wood');
INSERT INTO product_prices (3, 1, '5.00', '10.00', 'pvc');
INSERT INTO product_prices (4, 2, '15.00', '30.00', 'Mangoes only');
INSERT INTO product_prices (5, 3, '30.00', '60.00', '1 TB');
INSERT INTO product_prices (6, 3, '45.00', '90.00', '2 TB');
INSERT INTO product_prices (7, 3, '20.00', '40.00', '500 GB');
最佳答案
使用子查询获取每个产品的最低 min_price 并将其与产品价格结合以获得该产品图片的其余详细信息。
假设 min_price 对于产品是唯一的:-
SELECT p.*, pp.*, ROUND((pp.max_price-pp.min_price)/pp.max_price*100) AS price_diff_pct
FROM products p
LEFT OUTER JOIN
(
SELECT product_id, MIN(min_price) AS min_min_price
FROM Products_Prices
GROUP BY product_id
) sub0
ON sub0.product_id = p.id
LEFT JOIN Product_prices pp
ON pp.product_id = sub0.product_id
AND pp.min_price = sub0.min_min_price
编辑
如果您想避免子查询,您可以使用 2 个 LEFT OUTER JOIN 来实现。
这会获取产品,将其连接到产品价格,然后再次连接到第二个产品价格低于第一个的产品价格,然后使用 WHERE 子句排除任何找到第二个价格的地方(即检查第二个价格为空)。
SELECT p.*, pp1.*, ROUND((pp1.max_price-pp1.min_price)/pp1.max_price*100) AS price_diff_pct
FROM products p
LEFT OUTER JOIN Products_Prices pp1
ON pp1.product_id = p.id
LEFT OUTER JOIN Products_Prices pp2
ON pp2.product_id = pp1.product_id
AND pp2.min_price < pp1.min_price
WHERE pp2.product_id IS NULL
关于php - 如何通过连接表中的 mysql 查询检索最低价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24892805/