我正在尝试在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,11SELECT * 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等)选择视频,一旦您选择了标记到显示该标签下所有视频的页面。
如果你需要我扩展任何事情,请告诉我。
提前致谢。
答案 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 |
此外,您应该在videoID
和tagID
上设置此数据透视表的主键(使用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子句组合来接收特定结果并过滤掉未关联的结果。