繁体   English   中英

mysql搜索查询一对多表

[英]mysql search query on one to many tables

我有两个这样的表(_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
+----------+------------------------------------+

这取决于您想要获得什么,并提供哪些信息。 不过,我想你想获得信息, from _video给出一个特定的标签_video_tag 那你做

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

如果您的表是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM