在具有多个字符串的记录中搜索字符串的一部分

时间:2015-06-24 21:00:46

标签: mysql sql full-text-search

我在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();
        }
    }

1 个答案:

答案 0 :(得分:1)

您应该可以使用LIKE

SELECT id FROM artists WHERE names LIKE '%inem%';

%是外卡,说任何事都可以在它们之前或之后发生。

此外,在单个字段中存储多个值通常不是一个好主意。我建议将idnames放入复合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¢。