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

我反复使用以下查询,直到最终表中剩下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

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

#1楼 票数:0

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

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

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

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

#2楼 票数:0

从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')

  ask by ljmellor translate from so

未解决问题?本站智能推荐:

1回复

如果'表a'。'列a'与'表b'。'列a'匹配,如何用'表b'。'列b'替换'表a'。'列b'

我有2张桌子,如下所示: 表A 表B 如上所述,如何使用select语句选择2个表的价格范围? 示例:- SELECT * FROM TABLE A WHERE **price or price discount** BETWEEN 0 AND 2; 由于pro
2回复

在MySQL表中用'b'更新'a'记录,用'a'更新'b'

在我的表中有两个字段,一个是名字,另一个是性别。 我想解雇查询,以便每个男性都与女性一起更新,反之亦然。 我不想使用程序,触发器或功能。 我只能通过简单的查询来做到这一点。
1回复

COUNT(DISTINCT(以('A','B'

大家好,想知道是否有人可以提供以下帮助: 我的错误是在案例陈述中,我希望能够查看订单来自仓库的不同区域。 该语句的其余部分工作正常,但是如果我需要简化一下,我可以做。
3回复

为什么SELECT'a'='b'='c'在MYSQL中返回1?

我正在为涉及SQL注入的安全类做一些功课。 我发现我可以做一个比典型的' OR '1'=1示例更短的SQL注入。 相反,我可以'=' 。 输入这个是在典型登录框的密码字段中给出一个SQL查询,如下所示: 事实证明, password=''=''计算结果为1 ,允许SQL注入工作。
3回复

SQL Server:从{TABLE}中选择DISTINCT [COL1],其中[COL2] ='A'和[COL2] <>'B'

我必须SELECT DISTINCT [COL1] from {TABLE}找到一个SELECT DISTINCT [COL1] from {TABLE}在[COL1]中可以找到所有内容,在[COL2]中有'A',但在[COL2]中没有'B'在这种情况下为'3'和'4'应该是结果 表
2回复

如何使用mySQL添加像'A','B','C'这样的分数

你好我想问点事 如何在MySQL QUERY中添加ABCD之类的分数 就像如果百分比= 0得分A,如果百分比= 1直到20得分B 任何想法?
3回复

如何从文字列表中查询:从('a','b','c')中选择*

我正在使用mysql 5.5 ,这是带有literal列表的左联接查询: 但这不起作用! You have an error in your SQL syntax; check the manual that corresponds to your MySQL server vers
3回复

MySQL-如何选择所有子状态为('A','B')的记录?

对于我的问题,我有2张桌子。 tb1名称案例 tb2名称通话 我必须选择所有呼叫都包含('A','B')状态的案例 例: 案例A有3个来电。 呼叫A.1的状态为A 呼叫A.2的状态为A 呼叫A.3的状态为B 案例B有3个呼叫。 呼叫B.1的状态为A