删除两个连接的MySQL表中除X最新条目外的所有条目

时间:2013-06-21 22:34:10

标签: mysql join subquery left-join

我正在尝试一个查询,我将用它来修剪两个相关的mysql表。我会用它来删除除最近的条目以外的所有条目。

此查询的行为完全符合我的预期:

SELECT
    O.id  AS O_id,
    T.id  AS T_id
FROM
    rt.ObjectCustomFieldValues    AS O
    LEFT JOIN rt.Transactions     AS T
        ON O.id = T.NewReference
WHERE
        O.Disabled    = 1
    AND O.CustomField = 58
    AND O.ObjectId    = 202784
    AND T.id NOT IN (
                        SELECT
                            id
                        FROM
                            (
                                SELECT
                                    id
                                FROM
                                    Transactions
                                WHERE
                                    Field = 58
                                    AND ObjectId = 202784
                                ORDER BY
                                    Created DESC
                                LIMIT 5
                            ) Test
                    )

对于包含ObjectId 202784的行,除了最近的5个项目之外,我得到了ObjectCustomFieldValues ids和Transactions ids。

现在,如何将其转换为可以在所有行上运行的常规查询,而不是手动指定ObjectId?

总而言之,对于字段ID 58,我想迭代所有ObjectId值,并且对于每个值,删除除最新的ObjectCustomFieldValues和Transactions之外的所有值。

您可以在此处查看架构详细信息:
https://github.com/bestpractical/rt/blob/stable/etc/schema.mysql#L112

在这里:

https://github.com/bestpractical/rt/blob/stable/etc/schema.mysql#L328

1 个答案:

答案 0 :(得分:0)

如果您的结构不是INSERT数据UNIX_TIMESTAMP(),则根据您的整个数据库结构顺序,这可能很难。如果您添加UNIX_TIMESTAMP(),无论如何都可以正确使用ORDER BY