полнотекстовый запрос возвращает повторяющиеся строки - PullRequest
0 голосов
/ 29 июня 2011

Когда я выполняю следующий полнотекстовый запрос, который выполняет поиск по двум таблицам и двум индексам, я получаю дублированные данные. На самом деле я только что понял, почему НО Я не знаю, как это исправить.Когда я ищу testl, я получаю 4 дубликата, потому что в другой объединенной таблице есть 4 тега, которые проиндексированы.Если я ищу some new upload, я получаю 2 дубликата по той же причине.Кто-нибудь знает, как я могу решить эту проблему?

CREATE TABLE IF NOT EXISTS `video` (
  `timestamp` int(11) NOT NULL,
  `vid_id` varchar(32) NOT NULL,
  `file_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `uploader` varchar(55) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `subject_id` int(1) NOT NULL,
  FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `video`
--

INSERT INTO `video` (`timestamp`, `vid_id`, `file_name`, `uploader`, `title`, `subject_id`) VALUES
(1309290471, 'qcids3qhf95651wp2278f28w2crktaso', '7b682476bfb617a9ca889205c2a11efe', 'geoff', 'untitled', 1),
(1309290896, '6webkscr3pcc7knkg2zm29gkn4fp4eme', '14f5187c74f82b3fe7e4eaf4c3805eee', 'geoff', 'untitled', 1),
(1309291000, 's316v2k9vto73u4b7ap2gv51xr2emmh5', 'e01c5b9c1434330f0e7c2e50a00b2b7a', 'geoff', 'Testl', 7),
(1309299362, 'rdkz0twhvwr2j9mtfhqrrtrh311exhmm', 'e4261879a4f96a0eed3c5f4146bde7e8', 'geoff', 'Some new upload', 6);

CREATE TABLE IF NOT EXISTS `tags` (
  `id` varchar(35) NOT NULL,
  `vid_id` varchar(35) NOT NULL,
  `name` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  UNIQUE KEY `vid_id` (`vid_id`,`name`),
  FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tags`
--

INSERT INTO `tags` (`id`, `vid_id`, `name`) VALUES
('c37c449f6677e7980b5f6461efdfacfc', 's316v2k9vto73u4b7ap2gv51xr2emmh5', 'cool'),
('472b9aa1b863e4768eb27fcd19072e5b', 's316v2k9vto73u4b7ap2gv51xr2emmh5', 'o'),
('203c1490e86d734e2674b973a1bd1e26', 's316v2k9vto73u4b7ap2gv51xr2emmh5', 'yea'),
('aff5ec90a82fb22217ce32125e80b54e', 's316v2k9vto73u4b7ap2gv51xr2emmh5', 'p'),
('dd226125d0eaf0c89b06d0d5589ec7a0', 'rdkz0twhvwr2j9mtfhqrrtrh311exhmm', 'hot'),
('40fff048a8bd684eb946ff8400c0a653', 'rdkz0twhvwr2j9mtfhqrrtrh311exhmm', 'hos');

SELECT video.*,
  MATCH(video.title) AGAINST(? IN BOOLEAN MODE) as cscore, 
  MATCH(tags.name) AGAINST(? IN BOOLEAN MODE) as htscore
FROM video
LEFT JOIN tags ON video.vid_id=tags.vid_id
WHERE
  MATCH(video.title) AGAINST(? IN BOOLEAN MODE) OR
  MATCH(tags.name) AGAINST(? IN BOOLEAN MODE)
ORDER BY cscore DESC;

1 Ответ

2 голосов
/ 29 июня 2011

Я думаю, используя

SELECT DISTINCT video.*,

и т.д.

должен сделать трюк


На самом деле, не извините, не с

MATCH(tags.name) AGAINST(? IN BOOLEAN MODE) as htscore

Возможно, вам понадобится сделать что-то вроде SUM () htscore и GROUP BY видео. * Колонки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...