在过去的两天里,我一直在努力将根据输入的标签提取数据的查询放在一起。其目的是用于自动完成字段,其中用户输入的单词将拆分为标记。我真的需要使用LIKE运算符,因为自动完成的全部目的是用户不需要写出完整的单词
CREATE TABLE `movies` (
`id` int(10) unsigned NOT NULL,
`name` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `tags` (
`tag` varchar(50) NOT NULL DEFAULT '',
`mid` int(10) unsigned NOT NULL,
KEY `mid` (`mid`),
KEY `alphabetizer` (`tag`),
CONSTRAINT `tags_ibfk_1` FOREIGN KEY (`mid`) REFERENCES `movies` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
当前查询:
SELECT *
FROM movies ,
JOIN tags t ON m.id = t.mid
WHERE t.tag LIKE 'Dawn%' OR t.tag LIKE 'of%'
GROUP BY m.id
HAVING COUNT(DISTINCT m.tag) = 2
编辑:问题是,随着更多标签的添加,结果会变得模糊不清。这是相反的效果。
答案 0 :(得分:1)
SELECT m.id, group_concat(t.tag separator ', ') as tags
FROM movies
JOIN tags t
ON m.id = t.mid
GROUP BY m.id
HAVING group_concat(t.tag) like '%DAWN%'
and group_concat(t.tag) like '%OF%'
注意:标签是大写还是小写,还是混合?在上面的答案中,我认为它们都是大写的。如果标签不一致,您可以使用UPPER或LOWER功能,但它们应始终为大写或小写。
在上面的查询中,我使用group_concat显示每个ID的一行上的所有标记。这是一个只能在MYSQL中使用的MYSQL函数(你没有提到你正在使用的数据库)。如果postgresql你会使用string_agg,如果是Oracle你将使用LISTAGG。
答案 1 :(得分:0)
如果你做这样的事情怎么办
select mid,
group_concat(tag separator ' ') as fulltag
from tags
group by mid
上面的查询将获得整个标记列表。如果代码为movie_id 1
,则dawn,of,planet
说明,则查询结果为
1 dawn of planet
然后进行如下连接。另外,如果我认为用户一起输入标签dawn
和of
,那么在将其传递给查询之前,您可以将它们加入以使dawn of
作为单个字符串然后使用{{ 1}}运算符反对它。这样,您就不需要将多个LIKE
连接在一起。
基本上,如果用户输入LIKE
作为标记说dawn
。
如果用户输入like 'dawn%'
,dawn
和of
作为代码,请加入他们以制作planet
并说出dawn of planet
。
加入您可以在应用代码中执行的标记,然后将其作为参数传递给您的查询。
like 'dawn of planet%'