查找字符串列表的最佳匹配项

时间:2011-04-17 11:23:00

标签: mysql sql

我想解决以下问题。在我的数据库中有链接到日期的不同字符串。系统运行时,每个日期都会有大约三到二十个字符串链接到它。

现在我想使用字符串列表向数据库发送查询。数据库应该返回与查询具有最多共同字符串的日期。

我创建了一个示例数据库,您可以使用附加到此帖子的SQL脚本创建该示例数据库。在此示例中,我的查询将包含字符串“abc”, “yz”, “def”, “jkl”。然后,数据库应根据匹配的叮咬量订购日期。这意味着(100, '2005-05-05 05:05:05')应该是第一个,(103, '2008-08-08 08:08:08')应该是最后一个。没有必要根据另一个标准对具有相同数量的匹配字符串的那些进行排序。

我正在运行MySQL 5.5.11。我怎样才能实现这一目标?

    CREATE  TABLE sampledate(
      id INT NOT NULL PRIMARY KEY,
      time TIMESTAMP NOT NULL );

CREATE  TABLE  properties(
  idprop INT NOT NULL PRIMARY KEY,
  property VARCHAR(45) NOT NULL,
  iddate INT NOT NULL,
  FOREIGN KEY (iddate) REFERENCES sampledate(id)
);

INSERT INTO sampledate (id, time) VALUES ( 100, '2005-05-05 05:05:05');
INSERT INTO sampledate (id, time) VALUES ( 101, '2006-06-06 06:06:06');
INSERT INTO sampledate (id, time) VALUES ( 102, '2007-07-07 07:07:07');
INSERT INTO sampledate (id, time) VALUES ( 103, '2008-08-08 08:08:08');

INSERT INTO properties (idprop, property, iddate) VALUES (201, "abc", 100);
INSERT INTO properties (idprop, property, iddate) VALUES (202, "def", 100);
INSERT INTO properties (idprop, property, iddate) VALUES (203, "ghi", 100);
INSERT INTO properties (idprop, property, iddate) VALUES (204, "jkl", 100);

INSERT INTO properties (idprop, property, iddate) VALUES (301, "def", 101);
INSERT INTO properties (idprop, property, iddate) VALUES (302, "mno", 101);
INSERT INTO properties (idprop, property, iddate) VALUES (303, "pqr", 101);
INSERT INTO properties (idprop, property, iddate) VALUES (304, "stu", 101);
INSERT INTO properties (idprop, property, iddate) VALUES (305, "vwx", 101);

INSERT INTO properties (idprop, property, iddate) VALUES (401, "vwx", 102);
INSERT INTO properties (idprop, property, iddate) VALUES (402, "pqr", 102);
INSERT INTO properties (idprop, property, iddate) VALUES (403, "ghi", 102);
INSERT INTO properties (idprop, property, iddate) VALUES (404, "mno", 102);

INSERT INTO properties (idprop, property, iddate) VALUES (501, "vwx", 103);
INSERT INTO properties (idprop, property, iddate) VALUES (502, "mno", 103);
INSERT INTO properties (idprop, property, iddate) VALUES (503, "yz", 103);

1 个答案:

答案 0 :(得分:1)

这为您提供了匹配数量。

select iddate, count(iddate) as num_dates
from properties
where property in ('abc', 'yz', 'def', 'jkl')
group by iddate
order by num_dates desc

要获取日期数据,只需加入该查询。

select t1.*, t2.num_dates
from sampledate t1
inner join 
    (select iddate, count(iddate) as num_dates
     from properties
     where property in ('abc', 'yz', 'def', 'jkl')
     group by iddate) t2
on t1.id = t2.iddate
order by num_dates desc 

如果计数实际上需要基于属性的数量,因为该表允许一个日期有很多行,其中property ='abc',那么你只需计算该列而不是'iddate'。 / p>

select t1.*, t2.num_props
from sampledate t1
inner join 
    (select iddate, count(distinct property) as num_props
     from properties
     where property in ('abc', 'yz', 'def', 'jkl')
     group by iddate) t2
on t1.id = t2.iddate
order by num_props desc ;