我有这个查询,工作得很好:
SELECT * FROM
(
select
p.id,
comparestrings('marco', pc.value) as similarity
from
unit u, person p
inner join person_field pc ON (p.id = pc.id_person)
inner join field c ON (pc.id_field = c.id AND c.flag_name = true)
where ( u.id = 1 ) AND p.id_unit = u.id
) as subQuery
where
similarity is not null
AND
similarity > 0.35
order by
similarity desc;
让我解释一下情况。
表格:
person
ID 作为列。field
代表一列的表,例如name, varchar
(类似的东西)person_field
代表那个人和那个字段的价值。像这样:unit
与这个问题无关
例如。:
Person id 1
Field id 1 {name, eg)
value "Marco Noronha"
所以函数“comparestrings”返回一个从 0 到 1 的双精度数,其中 1 是精确的('Marco' == 'Marco')。
所以,我需要所有相似度高于 0.35 的人,我也需要它的相似度。
没问题,查询工作正常,正如它所预料的那样。但是现在我有一个新要求,即“person_field”表将包含一个更改日期,以跟踪这些行的更改。
例如。:
Person ID 1
Field ID 1
Value "Marco Noronha"
Date - 01/25/2013
Person ID 1
Field ID 1
Value "Marco Tulio Jacovine Noronha"
Date - 02/01/2013
所以我需要做的是,只考虑最新的行!如果我执行相同的查询,结果将是(例如):
1, 0.8
1, 0.751121
2, 0.51212
3, 0.42454
//other results here, other 'person's
假设我要带的值是 1, 0.751121(女巫是 DATE 的最新值)
我想我应该做类似 order by date desc limit 1
...
但如果我这样做,查询将只返回一个人 =/
像:
1, 0.751121
当我真的想要:
1, 0.751121
2, 0.51212
3, 0.42454