如何使用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;