2014-09-19 3 views
0

На этой странице представлены фильтры, на которых пользователь может выбрать любое количество тегов. Эти теги группируются по таксономии. При использовании такого типа фильтров выбранные статьи должны иметь по крайней мере один выбранный тег из каждой выбранной таксономии. Я считаю (мы можем сказать это для простоты) мы должны выбирать теги между различными таксономиями оператором AND и оператором OR для тегов внутри одной таксономии.Выбор по тегам из разных таксономий (AND + OR)

Filter on page: taxonomyes and Tags

Мои таблицы структуры:

Taxonomies поля: идентификатор

Метки поля: идентификатор, TAX_ID

Статьи поля: Идентификатор

ArticlesTags поля: идентификатор, tag_id, article_id

Что MySQL запросов или запросов можно использовать, чтобы получить статей с этими фильтрами?

+0

http://stackoverflow.com/q/11829617/1056384 – vatavale

ответ

0

Я сделал это в 2-х запросах.

Из выбора фильтра мы можем получить идентификаторы таксономий и тегов.
Во-первых - мы создаем таблицу temp, в которой мы группируем метки по таксономии для каждой статьи.

CREATE TEMPORARY TABLE IF NOT EXISTS mem_table (INDEX(article_id)) ENGINE=MEMORY AS 
    (
     SELECT articletags.article_id, articletags.tag_id, tags.tax_id 
     FROM aricletags 
     LEFT JOIN tags 
     ON articletags.tag_id=tag.id 
     WHERE articletags.tag_id IN (sel_tag1_id, sel_tag2_id, sel_tag3_id...) 
     GROUP BY article_id, tax_id" 
    ); 

Во-вторых - мы ищем в таблице темп по систематике и каждая статья должна иметь столько строк, сколько таксономических групп мы выбрали в фильтрах.

SELECT articels.id 
FROM articles 
INNER JOIN mem_table 
ON mem_table.article_id=article.id 
WHERE mem_table.tax_id IN (sel_tax1_id, sel_tax2_id, sel_tax3_id...)     
GROUP BY article.id 
HAVING COUNT(article.id) = sel_taxonomy_count 
+0

После экспериментов я обнаружил, что с индексом, который мы можем создать в момент таблицы создания памяти, вторая работа запроса быстрее и общая производительность это запросы растут. – vatavale

Смежные вопросы