一对多表上的mysql搜索查询

时间:2011-10-09 10:29:56

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

我有两张表(_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
+----------+------------------------------------+

2 个答案:

答案 0 :(得分:0)

这取决于您想要获得的信息,提供哪些信息。但是,我假设您希望在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';

答案 1 :(得分:0)

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