搜索与每个标记匹配的数据(使用LIKE运算符)

时间:2014-07-25 23:52:31

标签: sql relational-division

在过去的两天里,我一直在努力将根据输入的标签提取数据的查询放在一起。其目的是用于自动完成字段,其中用户输入的单词将拆分为标记。我真的需要使用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

编辑:问题是,随着更多标签的添加,结果会变得模糊不清。这是相反的效果。

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

然后进行如下连接。另外,如果我认为用户一起输入标签dawnof,那么在将其传递给查询之前,您可以将它们加入以使dawn of作为单个字符串然后使用{{ 1}}运算符反对它。这样,您就不需要将多个LIKE连接在一起。

基本上,如果用户输入LIKE作为标记说dawn。 如果用户输入like 'dawn%'dawnof作为代码,请加入他们以制作planet并说出dawn of planet

加入您可以在应用代码中执行的标记,然后将其作为参数传递给您的查询。

like 'dawn of planet%'