如何在MySQL中实现这种类型的搜索?

时间:2015-03-25 18:40:39

标签: mysql sql

我是一个SQL noobie,不知道如何正确地标题这个问题。如果有这种类型的搜索名称,请随时编辑标题,或发表评论,我会更改。

我有一个名为movies的表格:

-------------------------
| id       | movie_name |
-------------------------
| 0        | Star Wars  |
| 1        | Casablanca |
-------------------------

然后是一个名为movie_tag_options的表,其中包含所有允许的电影标签:

-------------------------
| id       | name       | 
-------------------------
| 0        | Action     |
| 1        | Sci-Fi     |
| 2        | Romance    |
-------------------------

然后是一个名为movie_tags的表格,这是标签分配给电影的方式:

---------------------------------------
| id       | tag_option_id | movie_id |
---------------------------------------
| 0        | 0             | 0        |
| 1        | 1             | 0        |
| 2        | 2             | 1        |
---------------------------------------

我想创建一个搜索功能,用户可以使用标签搜索电影,我会在进行MySQL搜索之前将其转换为标签选项ID。

因此,如果有人搜索带有“操作”和“科幻”标签的电影,我会将标记选项ID 01传递给搜索查询,该搜索查询应返回星球大战。

如何使用MySQL实现此类搜索?

除此之外:我考虑过将标记选项ID存储在movies的列中,然后使用Sphinx进行搜索,这很容易。不过,我不确定哪种方法更好。

2 个答案:

答案 0 :(得分:1)

您使用toxi架构

SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT( b.id )=3

根据需要调整

http://tagging.pui.ch/post/37027745720/tags-database-schemas

有更多例子

答案 1 :(得分:1)

SELECT 
    movies.name
FROM
    movies
    ,movie_tag_options
    ,movie_tags
WHERE
    movie_tag_options.name = 'Sci-Fi'
    AND movie_tag_options.id = movie_tags.tag_option_id
    AND movie_tags.movie_id = movies.id

以上查询将返回任何带有Sci-Fi标签的电影 我们正在选择电影中的任何行,movie_tag_options和movie_tags,其中movie_tag_option是sci-Fi,并且在movie_tags表中存在科幻ID,并且相同的movie_tags记录具有与电影表上的记录匹配的movie_id。