Поисковый запрос mysql на одну или несколько таблиц - PullRequest
0 голосов
/ 09 октября 2011

У меня есть две таблицы (_video, _video_tag), как это.

i как создать лучший поисковый запрос?

Я хочу поиск в этих полях (название, описание, тег)

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 голосов
/ 09 октября 2011

Если ваши таблицы MyISAM. Лучший масштабируемый способ - создать индекс FULLTEXT для заголовка и описания в таблице _video:

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
0 голосов
/ 09 октября 2011

Зависит от того, что вы хотите получить, какую информацию предоставить. Тем не менее, я предполагаю, что вы хотите получить информацию 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';

...