【问题标题】:mysql search query on one to many tables一对多表上的mysql搜索查询
【发布时间】:2011-10-09 10:29:56
【问题描述】:

我有两个这样的表(_video,_video_tag)。

我如何构建最佳搜索查询?

我想在这个字段中搜索(标题、描述、标签)

mysql> describe _video;
+-------------+---------------+------+-----+-------------------+----------------+
| Field       | Type          | Null | Key | Default           | Extra          |
+-------------+---------------+------+-----+-------------------+----------------+
| id          | int(11)       | NO   | PRI | NULL              | auto_increment |
| user_id     | int(11)       | NO   | MUL | NULL              |                |
| image       | varchar(255)  | NO   |     | NULL              |                |
| source      | varchar(255)  | YES  |     | NULL              |                |
| duration    | int(11)       | NO   |     | NULL              |                |
| title       | varchar(255)  | NO   |     | NULL              |                |
| slug        | varchar(255)  | NO   |     | NULL              |                |
| description | text          | NO   |     | NULL              |                |
| order       | int(11)       | NO   |     | 0                 |                |
| hit         | int(11)       | NO   |     | 1                 |                |
| status      | enum('0','1') | NO   |     | 1                 |                |
| date_add    | timestamp     | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+---------------+------+-----+-------------------+----------------+

mysql> select * from _video_tag limit 5;
+----------+------------------------------------+
| video_id | tag                                |
+----------+------------------------------------+
|    17748 | cevahir almanca dersi              |
|    17748 | genis aile                         |
|    17748 | ulvi                               |
|    17748 | cevahir                            |
|    17749 | oyle bir geçer zamanki
+----------+------------------------------------+

【问题讨论】:

    标签: mysql search full-text-search one-to-many


    【解决方案1】:

    如果您的表是 MyISAM 最好的可扩展方式是在 _video 表中的标题和描述上创建 FULLTEXT 索引:

    CREATE FULLTEXT INDEX title_desc ON _video( title, description )
    

    还有一个在 _video_tag 表中的标签列上:

    CREATE FULLTEXT INDEX tag ON _video_tag( tag )
    

    然后像这样查询:

    ( SELECT *,
      MATCH(title, description) AGAINT('some query string') AS relevance
      FROM _video
      WHERE MATCH(title, description) AGAINT('some query string') )
    UNION
    ( SELECT v.*
      MATCH(vt.tag) AGAINST('some query string') AS relevance
      FROM _video_tag AS vt
      INNER JOIN _video AS v ON( v.id = vt.video_id )
      WHERE MATCH(vt.tag) AGAINST('some query string') )
    ORDER BY relevance DESC
    

    【讨论】:

    • noboddy 感谢您的回答,但此查询包含任何语法错误“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以获取在 'AS 附近使用的正确语法相关性)在第 10 行按相关性 DESC' 排序"
    • 谢谢。仍然是个问题。此查询结果包含重复行:(如何解决此问题
    【解决方案2】:

    这取决于你想得到什么,提供哪些信息。但是,我假设您想在给定_video_tag 中的特定标签的情况下获取信息from _video。那你就做

    select v.* from _video_tag as vt left join _video as v on v.id = vt.video_id where vt.tag = 'Specify tag';

    【讨论】:

    • 我也在标题和描述中搜索。您的查询仅在标签中搜索
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多