Mysql - Помогите мне изменить этот поисковый запрос, чтобы получить желаемые результаты - PullRequest
0 голосов
/ 13 июня 2010

Ниже приведен дамп таблиц и данных, необходимых для понимания системы: -

Система состоит из репетиторов и классов. Данные в таблице All_Tag_Relations хранят отношения тегов для каждого зарегистрированного преподавателя и каждого класса, созданного преподавателем. Отношения тегов используются для поиска классов.

CREATE TABLE IF NOT EXISTS `Tags` (
  `id_tag` int(10) unsigned NOT NULL auto_increment,
  `tag` varchar(255) default NULL,
  PRIMARY KEY  (`id_tag`),
  UNIQUE KEY `tag` (`tag`),
  KEY `id_tag` (`id_tag`),
  KEY `tag_2` (`tag`),
  KEY `tag_3` (`tag`),
  KEY `tag_4` (`tag`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
(1, 'Sandeepan'),
(2, 'Nath'),
(3, 'first'),
(4, 'class'),
(5, 'new'),
(6, 'Bob'),
(7, 'Cratchit');


CREATE TABLE IF NOT EXISTS `All_Tag_Relations` (
  `id_tag` int(10) unsigned NOT NULL default '0',
  `id_tutor` int(10) default NULL,
  `id_wc` int(10) unsigned default NULL,
  KEY `All_Tag_Relations_FKIndex1` (`id_tag`),
  KEY `id_wc` (`id_wc`),
  KEY `id_tag` (`id_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `All_Tag_Relations` (`id_tag`, `id_tutor`, `id_wc`) VALUES
(1, 1, NULL),
(2, 1, NULL),
(3, 1, 1),
(4, 1, 1),
(6, 2, NULL),
(7, 2, NULL),
(5, 2, 2),
(4, 2, 2),
(8, 1, 3),
(9, 1, 3);

Следующий мой запрос: -

Этот запрос ищет «первый класс» (тег для first = 3 и для class = 4 в таблице тегов) и возвращает все эти классы так, чтобы в имени класса присутствовали как термины first, так и class.

SELECT wtagrels.id_wc,SUM(DISTINCT( wtagrels.id_tag =3)) AS
       key_1_total_matches,
       SUM(DISTINCT( wtagrels.id_tag =4))                AS
       key_2_total_matches
FROM   all_tag_relations AS wtagrels
WHERE  ( wtagrels.id_tag =3
          OR wtagrels.id_tag =4 )
GROUP  BY wtagrels.id_wc
HAVING key_1_total_matches = 1
       AND key_2_total_matches = 1
LIMIT  0, 20  

И возвращает класс с id_wc = 1.

Но я хочу, чтобы поиск показывал все эти классы так, чтобы все поисковые термины присутствовали в имени класса или имени его преподавателя Таким образом, поиск «Sandeepan class» (wtagrels.id_tag ​​= 1,4) или «Sandeepan Nath» также возвращает класс с id_wc = 1. И поиск. Поиск "Bob First" не должен возвращать никаких классов.

Пожалуйста, измените вышеуказанный запрос или предложите новый запрос, если возможно, используя MyIsam - полнотекстовый поиск, но каким-то образом помогите мне получить результат.

1 Ответ

1 голос
/ 13 июня 2010

Я думаю, что этот запрос поможет вам:

SET @tag1 = 1, @tag2 = 4; -- Setting some user variables to see where the ids go. (you can put the values in the query)

SELECT wtagrels.id_wc,
  SUM(DISTINCT( wtagrels.id_tag =@tag1 OR wtagrels.id_tutor =@tag1)) AS key_1_total_matches,
  SUM(DISTINCT( wtagrels.id_tag =@tag2 OR wtagrels.id_tutor =@tag2)) AS key_2_total_matches
FROM   all_tag_relations AS wtagrels
WHERE  ( wtagrels.id_tag =@tag1 OR wtagrels.id_tag =@tag2 )
GROUP  BY wtagrels.id_wc
HAVING key_1_total_matches = 1 AND key_2_total_matches = 1
LIMIT  0, 20

Он возвращает id_wc = 1.
Для (6, 3) запрос ничего не возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...