用于完全匹配的mysql LIKE语句

时间:2015-07-06 16:04:52

标签: php mysql sql sql-like

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

以下是我的代码

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

因此,为了尝试解释表格“视频”中的代码我有一个“标签”列,标签上填充了一些数据,如“1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20“每个视频都有自己的标签组合,现在我试图选择标签1存在的所有视频,但是上面将选择所有带有数字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然而我只是想要选择1,如果我选择11的所有视频,我只想要在“标签”中出现11的视频。

任何人都有关于我在哪里出错的想法?​​

表 我有2个表标签,视频见下面的示例

标签表

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

视频表

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

我选择了2张桌子而不是1张所以主要的视频表没有充斥着大量的完整标签名称,这些名称可能会很长,“击败它们,黑客和斜线”游戏“4”要短得多。

场景(如果这有帮助)

我正在建立一个网站,我将存储我的YouTube视频,以便可以在网站上多次找到它们,您可以通过标记(恐怖,RPG等)选择视频,一旦您选择了标记到显示该标签下所有视频的页面。

如果你需要我扩展任何事情,请告诉我。

提前致谢。

7 个答案:

答案 0 :(得分:1)

您可以尝试使用多个like

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

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

答案 1 :(得分:0)

在您的

中加入分隔符
SELECT * FROM `videos` WHERE `tags` LIKE '1 %' or `tags`=1 ORDER BY `videoID` DESC

答案 2 :(得分:0)

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

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

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

只会选择.1.,而不是.10.值。

在编写和更新查询时,您需要记住将每个标记包装在分隔符.中,并对其进行排序。

答案 3 :(得分:0)

我认为这样可以更好地分享你的内容,这些内容可以使用#34;,"然后你可以搜索

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

完全匹配将位于该字段的任何位置。

注意:Tha开始,字段的结尾应为(,1,2,3,4,)

答案 4 :(得分:0)

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

由于在您的模型中video可以包含许多tag,并且根据您之前的示例,您可以修改数据库以添加数据透视表:

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

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

名为tag_video的透视表:

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

此外,您应该在videoIDtagID上设置此数据透视表的主键(使用PRIMARY(videoID, tagID))。

然后根据一个标签(即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;

如果您想选择基于多个标签的视频(即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;

答案 5 :(得分:0)

使用正则表达式:

SELECT * FROM影片where代码REGEXP '[[:<:]]10[[:>:]]';

在这些字符组之间放置您要查找的号码。

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

答案 6 :(得分:0)

以下是我当前某个项目的一些代码片段

          $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子句组合来接收特定结果并过滤掉未关联的结果。