MySQL-标记多个表字段中的重复项以及其他表中的数据

时间:2018-07-13 04:15:23

标签: mysql sql

我有两个表格-一个显示用户购买的商品,另一个显示与相应产品类型相对应的产品ID。

我的客户希望根据姓氏和电子邮件地址使重复的用户处于非活动状态,但希望按产品类型(基于他们购买的产品类型)运行查询,并且只希望包含未购买的user_id油漆(产品编号5和6)。因此,查询将多次运行-对所有购买割草机的人,然后对所有购买吹草机的人,等等(这两者之间会有一些重叠)。购买了油漆的user_id不应被禁用。

在重复数据中谁应该保持活动状态,保持活动状态的人是购买的产品ID最高的人(因为产品每年发布)。如果它们有多个具有相同产品ID的记录,则保持活动状态的记录将是具有最新d_modified和t_modified的记录。

我还想将'inactive'的当前值移到'previously_inactive'列,以便在需要时可以很容易地将其反转。

这是一些样本表数据

enter image description here

如果查询是通过购买吹叶机来运行的,则第5、6和7行将变为非活动状态。这是预期的输出:

enter image description here

如果查询是通过购买割草机运行的,则第1行和第2行将变为非活动状态。这将是预期的输出:

enter image description here

如果第4行不是最新行,则仍不会被禁用,因为user_id 888购买了绘画(我们希望将这些user_id排除在非活动状态)。

这是针对“吹叶者”购买查询的未经优化的版本(它可以正常工作,但是在界面中可能会太慢):

UPDATE test.user_purchases
SET inactive = 1
WHERE id IN (
    SELECT z.id
    FROM (SELECT * FROM test.user_purchases) z
    WHERE z.product_id IN (
        SELECT product_id
        FROM test.products
        WHERE product_type IN ("leafblower")
    )
    AND id NOT IN (
        SELECT a.id
        FROM (SELECT * FROM test.user_purchases) a
        INNER JOIN (
            SELECT r.surname, r.email
            FROM (SELECT * FROM test.user_purchases) r
            JOIN test.products s on r.product_id = s.product_id
            WHERE s.product_type IN ("paint")
        ) b
        WHERE a.surname = b.surname
        AND a.email = b.email
    )
    AND id NOT IN (
        SELECT MAX(z.id)
        FROM (SELECT * FROM test.user_purchases) z
        WHERE z.product_id IN (
            SELECT product_id
            FROM test.products
            WHERE product_type IN ("leafblower")
        )
        AND id NOT IN (
            SELECT a.id
            FROM (SELECT * FROM test.user_purchases) a
            INNER JOIN (
                SELECT r.surname, r.email
                FROM (SELECT * FROM test.user_purchases) r
                JOIN test.products s on r.product_id = s.product_id
                WHERE s.product_type IN ("paint")
            ) b
            WHERE a.surname = b.surname
            AND a.email = b.email
        )
        GROUP BY surname, email
    )
)

任何有关如何简化此查询并优化查询速度的建议将不胜感激。

0 个答案:

没有答案