我需要做一个大的查询,但我只想要最新的记录。
对于单个条目,我可能会这样做
SELECT * FROM table WHERE id = ? ORDER BY date DESC LIMIT 1;
但是我需要为最大记录(数千条目)提供最新记录,但只能记录最新的记录。
这是我有的这不是很有效率。我想知道是否有更好的方法。
SELECT * FROM table a WHERE ID IN $LIST AND date = (SELECT max(date) FROM table b WHERE b.id = a.id);
如果您不想更改数据模型,可以使用DISTINCT ON从“a”中的每个条目从表“b”获取最新的记录:
SELECT DISTINCT ON (a.id) * FROM a INNER JOIN b ON a.id=b.id ORDER BY a.id,b.date DESC
如果要避免查询中的“排序”,添加这样的索引可能会帮助您,但我不确定:
CREATE INDEX b_id_date ON b (id,date DESC) SELECT DISTINCT ON (b.id) * FROM a INNER JOIN b ON a.id=b.id ORDER BY b.id,b.date DESC
或者,如果要从表“a”排序记录某种方式:
SELECT DISTINCT ON (sort_column,a.id) * FROM a INNER JOIN b ON a.id=b.id ORDER BY sort_column,a.id,b.date DESC
替代方法
然而,所有上述查询仍然需要从表“b”读取所有引用的行,因此如果您有大量数据,则可能仍然太慢。
您可以创建一个新表,它只保存每个a.id的最新“b”记录 – 甚至将这些列移动到“a”表中。