【问题标题】:How to implement this type of search in MySQL?如何在 MySQL 中实现这种类型的搜索?
【发布时间】:2015-03-25 18:40:38
【问题描述】:

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

我有一张桌子叫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 进行搜索,这很容易做到。不过,我不确定哪种方法更好。

【问题讨论】:

  • 这种类型的查询只是一个直接的JOIN。您将行链接在一起并获取任何匹配的内容。你也可以做 LEFT/RIGHT JOINS、OUTER JOINS 和其他一些。在 Google 上搜索“sql types of JOINS”,应该会提供一些有用的阅读。

标签: mysql sql


【解决方案1】:

你使用了一个有毒的模式

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

有更多例子

【讨论】:

    【解决方案2】:
    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
    

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

    【讨论】:

    • 要获取科幻和动作,请将movie_tag_options.name = 'Sci-Fi' 更改为movie_tag_options.name IN('Sci-Fi', 'Action')
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多