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

标签 php mysql

我有两张 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/

相关文章:

php - 如何在 Symfony 2.3 中呈现表单按钮?

php - Doctrine :架构:更新错误表 '$column' 上没有名称为 '$table' 的列

php - 在 Laravel 5.4 中执行批量删除语句时,如何根据 Eloquent 'deleting' 事件执行操作?

mysql - 如何解决sql中重复的id?

mysql - 如何在 Windows 上的 MySQL 上运行 innodb_force_recovery

php - 将 PHP 生成的 JS 变量发送到 Google map 的 JS 函数

php - 如何在 php 中获取谷歌分析实时 activeUsers?

php - 无法获得我想要的 max 结果(类似)

mysql - SQL:获取与日期时间最近的 N 行

mysql:在表的每一列中查找最大值