【问题标题】:mysql query to delete records that match multiple fieldsmysql查询删除匹配多个字段的记录
【发布时间】:2011-07-25 17:56:51
【问题描述】:

我有一个如下所示的数据库:

CREATE TABLE cargo (
    cargodate int unsigned NOT NULL,
    cargoname CHAR(128) NOT NULL,
    lattitude double NOT NULL,
    longitude double NOT NULL,
    user CHAR(64) NOT NULL
) type=MyISAM;

我想确保同一用户在同一地点的该货物的条目不超过 5 个。一个用户可以有多个条目,只要它们位于不同的位置(纬度、经度)。

如何让我的 sql INSERT 语句处理这个问题?

现在我执行:

   INSERT INTO cargo VALUES (UNIX_TIMESTAMP(), '{$cargoname}', '{$lat}', '{$lng}', '{$user}');

我可以删除,但我只想删除超过 5 个条目。在这种情况下,我想删除最旧的条目

谢谢 德肖恩特

【问题讨论】:

  • @ShinTakezou:他想使最旧的行无效,而不是禁止新行。
  • @Wrikken 嗯抱歉;他可以对他将“无效”的记录进行更新,而不是无效,例如像update ... set column = newvalue .... where condition of an invalid record...虽然这样如果记录不存在,它会失败(如果它们存在更多记录,他会更新所有);那么也许像“更新......如果存在,否则插入”查询?
  • 您可以使用 InnoDB 吗?即交易。
  • Ermmmm,为了识别最旧的 5 个条目(如果条目超过 5 个),必须有一个计数器(每个货物/位置/用户)或时间戳列

标签: php mysql sql database database-design


【解决方案1】:

您可以使用触发器http://dev.mysql.com/doc/refman/5.0/en/triggers.html 插入后,您可以删除所有不需要的条目。

【讨论】:

    【解决方案2】:

    使用 Ruslan Polutsygan 提到的触发器将是最自然的解决方案。

    如果你不想惹他们,那么另一种选择是运行:

    SELECT * FROM cargo ORDER BY cargodate DESC LIMIT 4,18446744073709551615
    

    在运行插入之前,然后删除该查询返回的行,然后执行插入。

    作为旁注,数字 18446744073709551615 是从 MySQL documentation 的示例中删除的:

    要检索从某个偏移量到结果集末尾的所有行,您可以为第二个参数使用一些较大的数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-10-19
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多