@stikname

Как сделать выборку из mysql базы записей и таблицы связей с категориями?

День добрый господа, подскажите следующий вопрос, как реализовать выборку из БД следующего вида: http://sqlfiddle.com/#!9/f62496/2

Что мы имеем:
1. Таблица записей
2. Таблица категорий
3. Таблица связи записей с категориями

Почти у всех записей по несколько категорий.

Необходимо реализовать 3 максимально быстрых MySQL запроса и проставить индексы:
1. Выборка 10 записей с определенной категорией, например 2, сортировка по полю date и условие date <= 1491502307 AND approve = 1
2. Выборка 10 записей в которых присутствуют одновременно три категории, например 2,4,6 (количество категорий может быть разное), с сортировкой по убыванию количества совпадений. Условие (date <= 1491502307 AND approve = 1) пример: sqlfiddle.com/#!9/aa8497/4. В данном примере выборка производится по трем категориям (может быть и более) и записи из бд выводятся сортируясь по количеству совпадений, по убывающей. Это максимум что я смог сделать.
3. Какие индексы нужно проставить для ускорения выборки ?

Решения есть, но кажется что они далеко не идеальные.
  • Вопрос задан
  • 1277 просмотров
Пригласить эксперта
Ответы на вопрос 1
@entermix
1.
SELECT `post`.* FROM `post` JOIN `post2cat` ON (`post2cat`.`id_post` = `post`.`id`)  WHERE `post2cat`.`id_category` = 2 AND `post`.`date` <= 1491502307 AND `post` .`approve` = 1 LIMIT 10;


2.
SELECT `post`.* FROM `post` JOIN `post2cat` ON (`post2cat`.`id_post` = `post`.`id`)  WHERE `post2cat`.`id_category` IN (2,4,6) AND `post`.`date` <= 1491502307 AND `post` .`approve` = 1 LIMIT 10;

OR
SELECT `post`.* FROM `post` JOIN `post2cat` ON(`post2cat`.`id_post` = `post`.`id`) WHERE (`post2cat`.`id_category` = 2 OR `post2cat`.`id_category` = 4 OR `post2cat`.`id_category` = 6) AND `post`.`date` <= 1491502307 AND `post` .`approve` = 1 LIMIT 10;

3. Индексы для post2cat:

-- Индексы таблицы `post2cat`

ALTER TABLE `post2cat`
  ADD PRIMARY KEY (`id_post`,`id_category`),
  ADD KEY `fk_id_post` (`id_post`) USING BTREE,
  ADD KEY `fk_id_category` (`id_category`) USING BTREE;

--
-- Ограничения внешнего ключа таблицы `post2cat`
--
ALTER TABLE `post2cat`
  ADD CONSTRAINT `post2cat_ifbk_1` FOREIGN KEY (`id_post`) REFERENCES `post` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `post2cat_ifbk_2` FOREIGN KEY (`id_category`) REFERENCES `category` (`id`) ON DELETE CASCADE;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы