繁体   English   中英

如果'table a'。'column b'与'table b'。'column a'相匹配,如何用'table b'。'column b'替换'table a'。'column b'

[英]how to replace 'table a'.'column b' with 'table b'.'column b' if 'table a'.'column b' matches 'table b'.'column a'

我有多个与我公司销售的产品有关的表被新产品取代,随着时间的流逝,导致出现多个表。

我反复使用以下查询,直到最终表中剩下2个产品为止...

CREATE TABLE mar15a    
SELECT x.sku, x.superseded_sku FROM table x
JOIN table y ON y.sku = x.superseded_sku  

我现在有5个表(mar15a,mar15b,... mar15e),它们遵循此结构。

------------------------------------
| sku            | superseded_sku  |
------------------------------------
| PartA          | PartC           |
| PartB          | PartC           |
| PartC          | PartD           |

那么,现在如何将它们结合起来以得到一个最终列表,该列表显示表D中表E的替代品,等等?

我希望这是有道理的,今天我的大脑受伤了。

这里有一个sqlfiddle可以给出更多的想法,我已经包含了表A的一部分和表B的全部。


我已经尝试过了...

设置一个 superseded_sku = b。 从mar15a到superseded_sku a。 superseded_sku = b.sku内部联接mar15b b ON b.sku = a.sku

这不起作用,但应该大致了解我要实现的目标。

对于您想要的东西,我还是有些朦胧,但是如果我误解了,我会尝试一种解决方案,然后对其进行修改。

据我所知,您想要的只是通过如下查询完成的:

SELECT
    a.superseded_sku, d.sku
FROM
    mar15a a                JOIN

    mar15b b ON
        a.sku = b.superseded_sku    JOIN

    mar15c c ON
        b.sku = c.superseded_sku    JOIN

    marl5d d ON
        c.sku = d.superseded_sku

如果您能解释为什么这不能产生您想要的结果,我可以根据需要进行修改。

从sqlfiddle中的数据来看,您似乎已取代了skus,它们已被自己取代在一个表中。 这使问题变得更加困难,使用单个查询可能无法解决。

您可能事先不知道sku被取代了多少次,所以我看不出有什么方法可以避免在SQL之外处理数据。 您将必须对结果执行验证检查,以查看是否已再次取代任何取代的skus。

问题的难度和复杂性表明,您可能会发现重构模型更容易。 如果您为每个“产品”都有一个ID,则可以保留原始记录,并使用日期范围来查找原始值和被取代的值(我将“产品”用作可能被取代或可能未被取代的项目的术语,不一定是库存商品)

在这种情况下,您的模型将如下所示:

CREATE TABLE sku_history (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
    `product_id` INT UNSIGNED NOT NULL,
    `sku` VARCHAR(19) NOT NULL,
    `datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP()
) ENGINE = 'MyISAM';

要获取开始的sku,您需要将sku_history加入到同一表的版本中,但是需要按产品ID分组并使用最早的datetime值进行分组,例如

SELECT 
    product_id,
    sku
FROM sku_history
JOIN (
    SELECT 
        product_id, 
        MIN(`datetime`) `datetime` 
    FROM sku_history
    GROUP BY product_id
) min USING (product_id, `datetime`)

要获取被取代的sku,您可以执行相同的操作,但是将最早的日期时间交换为最新的日期时间(将MIN()更改为MAX())

对于最终表,您可以将这些结果集结合在product_id上,并删除sku不变的所有结果,如下所示:

SELECT
    original.sku,
    superseded.sku AS superseded_sku
FROM (
    SELECT 
        product_id,
        sku
    FROM sku_history
    JOIN (
        SELECT 
            product_id, 
            MIN(`datetime`) `datetime` 
        FROM sku_history
        GROUP BY product_id
    ) min USING (product_id, `datetime`)
) original
JOIN (
    SELECT 
        product_id,
        sku
    FROM sku_history
    JOIN (
        SELECT 
            product_id, 
            MAX(`datetime`) `datetime` 
        FROM sku_history
        GROUP BY product_id
    ) max USING (product_id, `datetime`)
) superseded ON original.product_id = superseded.product_id
WHERE original.sku != superseded.sku;

如果要查找特定日期范围(例如,上个月至本月之间)之间的sksk,您需要做的就是在每个子查询中添加datetime条件(例如WHERE'datetime'> '2015-03-01')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM