Возврат только проверенных записей по таблице поиска - PullRequest
1 голос
/ 28 ноября 2011

Я использую MySQL, и у меня есть небольшая проблема, из-за которой я пытаюсь найти решение Я могу достичь этого программно через PHP, используя несколько запросов, но я уверен, что могу сделать это как один запрос :)

У меня есть 3 таблицы:

  1. Продукты
  2. product_keywords
  3. valid_keywords

Каждый продукт имеет несколько ключевых слов, на которые ссылается ключевое слово в таблице «product_keywords». Таблица «valid_keywords» содержит только разрешенные ключевые слова (то есть как справочную таблицу). Мне нужно вернуть ТОЛЬКО продукты, ключевые слова которых соответствуют ключевым словам в таблице «valid_keywords».

В допустимых продуктах не должно быть ключевых слов, которых нет в таблице "valid_keywords".

Вот несколько тестовых таблиц / записей:

- Структура таблицы для столовых изделий

CREATE TABLE `products` (
  `prod_id` int(11) NOT NULL,
  `prod_name` varchar(10) NOT NULL,
  KEY `prod_id` (`prod_id`)
);

- Данные для табличных продуктов

INSERT INTO `products` (`prod_id`, `prod_name`) VALUES(1, 'Prod 1');
INSERT INTO `products` (`prod_id`, `prod_name`) VALUES(2, 'Prod 2');
INSERT INTO `products` (`prod_id`, `prod_name`) VALUES(3, 'Prod 3');
INSERT INTO `products` (`prod_id`, `prod_name`) VALUES(4, 'Prod 4');

- Структура таблицы для таблицы product_keywords

CREATE TABLE `product_keywords` (
  `prod_id` int(11) NOT NULL,
  `keyword_id` int(11) NOT NULL,
  KEY `prod_id` (`prod_id`),
  KEY `keyword_id` (`keyword_id`)
);

- Данные для таблицы product_keywords

INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(1, 1);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(1, 2);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(2, 2);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(2, 4);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(3, 4);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(3, 6);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(4, 7);
INSERT INTO `product_keywords` (`prod_id`, `keyword_id`) VALUES(4, 8);

- Структура таблицы для таблицы valid_keywords

CREATE TABLE `valid_keywords` (
  `keyword_id` int(11) NOT NULL,
  `keyword_name` varchar(10) NOT NULL,
  KEY `keyword_id` (`keyword_id`)
);

- Данные для таблицы valid_keywords

INSERT INTO `valid_keywords` (`keyword_id`, `keyword_name`) VALUES(2, 'Keyword 2');
INSERT INTO `valid_keywords` (`keyword_id`, `keyword_name`) VALUES(4, 'Keyword 4');
INSERT INTO `valid_keywords` (`keyword_id`, `keyword_name`) VALUES(7, 'Keyword 7');
INSERT INTO `valid_keywords` (`keyword_id`, `keyword_name`) VALUES(8, 'Keyword 8');

Для данных примера запрос должен возвращать продукты 2 и 4.

Надеюсь, вы, ребята, можете указать мне правильное направление.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Получить продукты, у которых нет недопустимого ключевого слова.

SELECT prod_id,
       prod_name
FROM   products
WHERE  prod_id NOT IN (SELECT prod_id
                       FROM   product_keywords
                       WHERE  keyword_id NOT IN (SELECT keyword_id
                                                 FROM   valid_keywords));  
1 голос
/ 28 ноября 2011

Попробуйте это -

SELECT p.prod_id FROM products p
  LEFT JOIN product_keywords pk
    ON p.prod_id = pk.prod_id
  LEFT JOIN valid_keywords vk
    ON vk.keyword_id = pk.keyword_id
GROUP BY p.prod_id
  HAVING COUNT(vk.keyword_id) = COUNT(pk.keyword_id);

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