SQL只插入表,如何只选择最新的条目

时间:2012-05-29 14:07:54

标签: mysql sql

为了速度和维护历史记录,我创建了一个仅插入表。它的结构非常通用,如下:

  `id` bigint(20) unsigned NOT NULL auto_increment,
  `user_id` bigint(20) unsigned NOT NULL,
  `property` varchar(32) NOT NULL,
  `value` longblob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

它只是一个分配了user_id的键/值表。这种方法有其优点,因为并非所有用户都具有相同的属性,因此字段不会浪费在表中。此外,它允许更改滚动日志,因为我可以看到用户对特定属性所做的每个更改。

现在,由于此表中没有删除或更新,我可以假设最大的id将始终是最新的条目。

但是,我想一次选择多个属性,例如'address1','address2','city','state',我希望每个属性都是具有最高id的类型的条目。

所以,如果他们已经8次更改了'state'属性,并且'city'属性改变了4次,那么我只想让SELECT返回每个属性的最新状态(1个州和1个城市)。

我不确定这种类型的表格是否可以有效地完成,因此我对不同的表格方法持开放态度。

如果我需要提供更多信息或更好地澄清我的问题,请告诉我。

=== 我尝试了以下操作,但是,在最后一次'address2'更改后,可能会有3行'address1'更改。也许使用GROUP BY会起作用吗?

SELECT property, value FROM kvtable WHERE user_id = 1 AND (property = 'address1' OR property = 'address2') ORDER BY id

1 个答案:

答案 0 :(得分:4)

假设你的id是增量整数并且你没有手动指定它们,你可以在子查询中使用一些MAX()聚合来完成这项工作。子查询的要点是为每个用户返回每个属性名称的最新条目。这与整个表连接以引入相关的属性值。实质上,子查询会丢弃每个组没有max(id)的所有行。

SELECT kvtable.* 
FROM
  kvtable
  JOIN (
    SELECT
      MAX(id) AS id,
      user_id,
      property
    FROM kvtable
    /* optionally limit by user_id */
    WHERE user_id = <someuser>
    GROUP BY user_id, property
  ) maxids ON kvtable.id = maxids.id