
[英]how to replace 'table a'.'column b' with 'table b'.'column b' if 'table a'.'column a' matches 'table b'.'column a'
[英]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.