我在artists
表中有以下记录:
| id | names |
| 1 | eminem rihanna rita ora|
| 2 | taylor swift beyonce |
我想使用inem
搜索示例,我希望找到此记录的id
,在这种情况下为id = 1
。我正在使用Full Text Search in MySQL
。
有没有更好的技术来实现这一目标?
更新
| id | video_name | title | artists | search_tags |
| 1 | onajr | o'najr | kida | onajr o'najr kida |
我想使用此字符串进行搜索。 onajr, ona, kida, kid
。
因此,用户可以使用搜索标签(包括标签的一部分)进行搜索。
这是我在php中的功能。 :
public function tags_search() {
//echo 'ok';
$db = DB::get_instance();
//single word
$query = "
select * from `videos`
where
match(`search_tags`) against (':video_name' IN BOOLEAN MODE) order by rand()
limit 1
";
try {
$run_query = $db->prepare($query);
$run_query->execute(array(
':string' => $this->string
));
return ($run_query->rowCount() == 1) ? $run_query->fetch(PDO::FETCH_OBJ)->video_name : false;
} catch(PDOException $e) {
echo $e->getMessage();
}
}
答案 0 :(得分:1)
您应该可以使用LIKE
SELECT id FROM artists WHERE names LIKE '%inem%';
%
是外卡,说任何事都可以在它们之前或之后发生。
此外,在单个字段中存储多个值通常不是一个好主意。我建议将id
和names
放入复合PK中,然后每个字段只有一个名称。
例如)
| id | name |
| 1 | eminem |
| 1 | rihanna |
| 1 | rita ora |
| 2 | taylor swift |
| 2 | beyonce |
如果您打算添加更多字段,则应该在另一个表中。了解database normalization的原因。
更新后修改:
我仍然认为LIKE
语句符合您的目的,您唯一要做的就是为每个逗号描述的标记词添加AND search_tags LIKE '%ona%'
等。
就像你上面的例子一样:
SELECT id FROM artist
WHERE search_tags LIKE '%onajr%'
AND search_tags LIKE '%ona%'
AND search_tags LIKE '%kida%'
AND search_tags LIKE '%kid%';
我不太了解PHP实际上给你一些代码,但经过短暂的搜索,explode()似乎是你想要看的功能。然后只需为每个搜索标记附加额外的SQL。如果要将标记拆分为另一个表,此方法也可以使用。如果我没有弄错的话,如果你走这条路,你应该只需要按照歌曲分组。
不确定这一切是否比你拥有的更好。正如我所说的,我不太了解PHP,我没有和match(...) against(...)
混淆,但我认为我会投入自己的2¢。