mysql LIKE 语句做精确匹配

mysql LIKE statement to do exact match

我正在尝试在 mysql 中使用 LIKE 语句,我的代码有点像一半的工作但它没有按预期工作(或者至少我想象它是如何工作的)

下面是我的代码

SELECT * FROM `videos` WHERE `tags` LIKE '%1%' ORDER BY `videoID` DESC

因此,为了尝试解释 table "videos" 中的代码,我有一列 "tags",标签中填充了一些数据,例如“1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 “每个视频都有自己的一组标签,由上述组合组成,现在我正在尝试 select 所有带有标签 1 的视频,但是上面会 select 所有带有数字 1 的视频,所以 1、10、11,如果我将代码更改为

SELECT * FROM `videos` WHERE `tags` LIKE '%1' ORDER BY `videoID` DESC

如果我把它改成

它会选择1,10,11
SELECT * FROM `videos` WHERE `tags` LIKE '1%' ORDER BY `videoID` DESC

它会同时选择 1 和 11,但是如果我选择所有带有 11 的视频,我只想让它像明智地选择 1 我只希望 "tags" 中出现的带有 11 的视频被精选。

有人知道我在这方面哪里出了问题吗?

表 我有 2 个 tables 标签,示例见下方视频

标签table

| tagID | tagTitle | tagImage |
| 1     | Anime    | PATH     |
| 2     | FPS      | PATH     |
| 3     | RPG      | PATH     |

视频table

| videoID | tags     | videoTitle |
| 1       | 2 3      | EXAMPLE    |
| 2       | 1        | EXAMPLE    |
| 3       | 1 2 3    | EXAMPLE    |

我选择了 2 table 秒而不是 1 秒,所以主要视频 table 没有乱七八糟的完整标签名称,"beat em up and hack and slash" 游戏可能会变得很长“4”要短得多。

场景(如果有帮助)

我正在制作一个网站,我将在其中存储我的 YouTube 视频,以便可以从网站上的多个位置找到它们,您可以在选择标签后按标签(恐怖、角色扮演等)选择视频进入将显示该标签下所有视频的页面。

如果您需要我扩展任何内容,请告诉我。

提前致谢。

在你喜欢的地方加上分隔符

SELECT * FROM `videos` WHERE `tags` LIKE '1 %' or `tags`=1 ORDER BY `videoID` DESC

您可以尝试多个 like:

where `tags` like '% 1 %'
   or `tags` like '1 %'
   or `tags` like '% 1'
   or `tags` = '1'

它应该在字符串的中间、开头或结尾匹配 1。如果每个字符串内的标签 有序 (根据您的示例做出的假设),您可以仅使用第二个 like 和完全匹配 = 检查。

你需要用你的间隔符填充你的列值,诀窍是使用 NON-SPACE 作为分隔符,这样 MySQL 就不会自动整理它,所以使用句号/句号作为数值的分隔符。

然后只需 运行 一个 LIKE 子句:

SELECT * FROM `videos` WHERE `tags` LIKE '%.1.%' ORDER BY `videoID` DESC

这只会 select .1.,而不是 .10. 值。

在编写和更新您的查询时,您需要记住将每个标记包裹在分隔符中,. 就是这样,已排序。

我认为最好将您的内容与逗号“,”分开,然后您可以搜索

WHERE `tags` LIKE '%,1,%'

精确匹配将位于字段的任何位置。

注意:字段的开始和结束应该是,(,1,2,3,4,)

也许您应该考虑使用 pivot table 而不是将所有这些标签塞进同一列,这意味着每次执行该查询时都使用正则表达式解析。

因为在您的模型中,一个 video 可以有多个 tag,并且根据您之前的示例,您可以修改数据库以添加一个数据透视表 table :

| tagID | tagTitle | tagImage |
| 1     | Anime    | PATH     |
| 2     | FPS      | PATH     |
| 3     | RPG      | PATH     |

| videoID | videoTitle |
| 1       | EXAMPLE    |
| 2       | EXAMPLE    |
| 3       | EXAMPLE    |

枢轴 table 名为 tag_video :

| videoID  | tagID  |
| 1        | 2      |
| 1        | 3      |
| 2        | 1      |
| 3        | 1      |
| 3        | 2      |
| 3        | 3      |

此外,您应该在 videoIDtagID 上设置此枢轴 table 的主键(通过使用 PRIMARY(videoID, tagID))。

然后 select 个基于一个标签(即 1)的视频,你做:

SELECT * from `videos` as v
INNER JOIN `tag_video` as tv
ON v.videoID = tv.videoID
WHERE tv.`tagID` = 1
ORDER BY v.`videoID` DESC;

如果您想 select 基于多个标签(即 1、3 和 22)的视频,此结构将允许更快的结果。然后你做:

SELECT * from `videos` as v
INNER JOIN `tag_video` as tv
ON v.videoID = tv.videoID
WHERE tv.`tagID` IN (1, 3, 22)
ORDER BY v.`videoID` DESC;

使用正则表达式:

SELECT * FROM视频where标签REGEXP '[[:<:]]10[[:>:]]';

将您要查找的数字放在这些字符组之间。

[[:<:]],[[:>:]] :这些标记代表单词边界,因此它们分别匹配单词的开头和结尾。将逗号替换为您要查找的数字。

这是我当前项目之一的一些代码片段

          $sql = 'SELECT * from tbl_fish where MATCH(fish_name,size_name,cat_name) AGAINST(:search_query)';

................................................ .......... 这是返回的内容

    $row_all = $statement->fetchall(PDO::FETCH_ASSOC);
            header('Content-type: application/json');
            echo json_encode($row_all);

在这种情况下,用户必须输入鱼的实际名称或重量才能获取其结果,然后以列出与该名称相关联的整行的形式返回/(ID)

换句话说,您可以使用 MATCH AGAINST 子句组合来接收特定结果并过滤掉不相关的结果。