mysql - 全文查询返回重复行

标签 mysql sql

当我执行以下全文查询来搜索两个表和两个索引时,我得到了重复的数据。 我实际上只是弄清楚了原因,但我不知道如何解决它。当我搜索 teSTL 时,我得到 4 个重复项,因为另一个已索引的连接表中有 4 个标签。如果我搜索一些新上传,出于同样的原因,我会得到 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;

最佳答案

我认为使用

SELECT DISTINCT video.*,

等等

应该可以解决问题

<小时/>

其实,没有对不起

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

您可能需要对 htscore 执行 SUM() 操作,并按视频进行 GROUP BY。* 列

关于mysql - 全文查询返回重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6517323/

相关文章:

mysql - 连接和计算问题

sql - 如何在查询多个表的多列时从单个表的单列使用MAX

php - 如何提取数据表中所选行的第一列?

javascript - 从两个变量计算任务的紧迫性

Python Sqlite 一次插入一个数字字符串

MySQL - UNION ALL 查询 - 未知列错误

php - 如何从搜索结果中每页显示 n 行数

mysql - 从服务器下载图像目录并存储在iPhone上

MySQL查询多个属性

php - 制作一条根据结果中一列的内容动态选择 INNER JOIN 的 SQL 语句