Найти лучшее соответствие для списка строк - PullRequest
2 голосов
/ 17 апреля 2011

Мне нравится решать следующую проблему. В моей базе данных есть разные строки, связанные с датой. Каждая дата будет иметь от трех до двадцати строк, связанных с ней во время работы системы.

Теперь я хотел бы отправить запрос в базу данных со списком строк. База данных должна вернуть мне дату, которая имеет наибольшее количество общих строк с запросом.

Я создал образец базы данных, которую вы можете создать с помощью сценария 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 Ответ

1 голос
/ 17 апреля 2011

Это дает вам количество совпадений.

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 

Если счет действительно должен быть основан наколичество свойств, поскольку таблица позволяет одной дате иметь много строк, где свойство = 'abc', тогда вы просто посчитаете этот столбец вместо 'iddate'.

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...