如何使用Php管理不同MySql表中的多个价目表和项目?
我必须管理多个具有不同有效期开始日期的价目表 如何从价目表中仅选择具有正确有效日期的价格? 如果一个项目有一个以上的价格,我必须只采取最近的一个,但日期不迟于今天! 我希望我能解释清楚 通常我使用内部联接,但在这种情况下,我不知道如何正确选择数据 我需要这样的东西:如何使用Php管理不同MySql表中的多个价目表和项目?,php,mysql,join,Php,Mysql,Join,我必须管理多个具有不同有效期开始日期的价目表 如何从价目表中仅选择具有正确有效日期的价格? 如果一个项目有一个以上的价格,我必须只采取最近的一个,但日期不迟于今天! 我希望我能解释清楚 通常我使用内部联接,但在这种情况下,我不知道如何正确选择数据 我需要这样的东西: SELECT * FROM $item_table LEFT JOIN $price_table ON $item_table.product_code = $price_table.product_code WHERE (
SELECT * FROM $item_table
LEFT JOIN $price_table ON $item_table.product_code = $price_table.product_code
WHERE ($price_table.validity_date /*is the most recent but no later than today*/ )
我给你举一个表结构的例子:
Items table
+-------+--------------+-------------+
| Brand | Product Code | Description |
+-------+--------------+-------------+
| XXX | XXX-123 | Lorem ipsum |
| XXX | XXX-456 | Lorem ipsum |
| YYY | YYY-123 | Lorem ipsum |
| YYY | YYY-456 | Lorem ipsum |
| ZZZ | ZZZ-123 | Lorem ipsum |
+-------+--------------+-------------+
Price lists table
+-------+--------------+-------+---------------------+
| Brand | Product Code | Price | Validity Start Date |
+-------+--------------+-------+---------------------+
| XXX | XXX-123 | 10.00 | 2016/01/01 |
| YYY | YYY-123 | 20.00 | 2016/01/01 |
| XXX | XXX-123 | 12.00 | 2017/01/01 | <- I need this one
| YYY | YYY-123 | 22.00 | 2017/01/01 | <- I need this one
| XXX | XXX-123 | 15.00 | 2018/01/01 |
| YYY | YYY-123 | 25.00 | 2018/01/01 |
+-------+--------------+-------+---------------------+
不幸的是,我无法输入价格有效期结束日期,因为当我输入时,我不知道下一个价目表何时加载。
否则的话,事情就容易多了
我接受任何关于以不同方式构建价目表的建议,如果这可以导致更简单的解决方案 您需要找到唯一符合以下规则的产品: 品牌是$Brand 产品代码为$code 开始日期早于截止日期 开始日期是以前匹配的最大值 因此,如果我只想要价格,那么我将如何表述我的查询:
SELECT `Price`
FROM `Price lists`
WHERE `Brand` = :brand
AND `Product Code` = :productCode
AND `Validity Start Date` = (
SELECT MAX(`Validity Start Date`)
FROM `Price lists`
WHERE `Brand` = :brand
AND `Product Code` = :productCode
AND `Validity Start Date` < CURDATE()
)
编辑:在内部功能中增加了对品牌和产品代码的过滤
重新编辑:因此,如果您需要一个包含所有产品的完整表,并且每行的价格都正确,那么它将提供以下查询
SELECT a.*, b.Price, b.`Validity Start Date`
FROM Items a
LEFT JOIN (
SELECT `Product Code`, `Validity Start Date`, Price
FROM `Price lists`
WHERE `Validity Start Date` < CURDATE()
) b ON a.`Product Code` = b.`Product Code`
WHERE b.`Validity Start Date` = (
SELECT MAX(`Validity Start Date`)
FROM `Price lists`
WHERE `Product Code` = a.`Product Code`
AND `Validity Start Date` < CURDATE()
)
按有效期开始日期对价目表和订单进行子查询。第一行应该返回当前价格别忘了在内部查询中过滤品牌和产品代码。不幸的是,它不适合我。。。我需要加入表格。如何使用JOIN调整您的查询?谢谢这是一个有趣的解决方案。。。但对我来说有点复杂。非常感谢。
SELECT MIN(test.diff),test.* FROM (SELECT *,DATEDIFF(`Validity Start Date`,CURDATE())as diff FROM `Price_lists_table` LEFT JOIN $price_table ON $item_table.product_code = $price_table.product_code WHERE DATEDIFF(`Validity Start Date`,CURDATE()) >0 ) as test;