如何通过连接表中的mysql查询检索最小价格

时间:2014-07-22 16:26:42

标签: php mysql

我有两张桌子

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');

2 个答案:

答案 0 :(得分:1)

使用子查询获取每个产品的最低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

答案 1 :(得分:0)

您可以对表Products_prices使用另一个字段(is_active)。当您插入新行时,请生成is_active ='N',然后您可以相应地更改连接查询。