为了速度和维护历史记录,我创建了一个仅插入表。它的结构非常通用,如下:
`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
答案 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