Я запрашиваю таблицу названий сделок по набору ключевых слов приключений и отмечаю связанные приключения, когда в названии присутствует один из терминов, связанных с приключением. Чтобы сопоставить несколько приключений с несколькими сделками в наименьшем количестве запросов, я разбил это на два этапа:
Я создал временную таблицу для объединения всех поисковых терминов для каждого приключения в один столбец с конкатенацией "|" так что я могу использовать его в регулярном выражении.
объедините эту временную таблицу с таблицей сделок по поисковым предложениям.
Это прекрасно работает, но у меня есть два вопроса:
Можно ли сделать это в подзапросе без создания временной таблицы?
Я хотел бы добавить в свою таблицу условий поиска статус, который классифицирует условия поиска как отрицательные или положительные. Тогда я хотел бы искать названия сделок и возвращать совпадения только в том случае, если в названии содержится один или несколько положительных терминов, а в названии - ни одного из отрицательных. Я не могу понять, как получить результаты двух разных типов состояния из одной и той же таблицы, а затем использовать результаты для соединения / запроса другой таблицы. Как мне это сделать?? Я еще не использовал переменные или хранимые процедуры с SQL, но кажется, что это может быть путь?
Вот первая часть кода.
У меня есть таблица поисковых терминов, связанных с приключением:
search_terms
id | adventure_id | term
130 124 kitesurf
131 124 kiteboard
132 124 kite surf
133 124 kite-surf
134 124 kite board
135 125 water ski
135 125 waterski
adventures
id | activity
124 Kite boarding
125 Waterskiing
и таблица сделок, связанных с бизнесом
deals
id | title | biz_id ...
3 50% off waterskiing on the lake 10
SQL:
create temporary table tmp1 as
select adv.activity,st.adventure_id, GROUP_CONCAT(st.term SEPARATOR '|') as `match`
FROM (search_terms st)
JOIN adventures adv ON adv.id=st.adventure_id
GROUP BY adv.id;
select d.biz_id, temp.adventure_id, d.id as deal_id
from daily_deals d
JOIN tmp1 temp ON d.title REGEXP temp.match;
Теперь перейдем ко второму вопросу. Я добавил столбец статуса в таблицу search_terms, чтобы
SEARCH_TERMS
id | adventure_id | срок | статус (да или нет)
и в основном я хочу иметь возможность сказать GROUP_CONCAT (st.term , которые имеют статус = да SEPARATOR '|') как **yes**
и GROUP_CONCAT (st.term (которые являются статусом = нет) SEPARATOR '|') как **no**
и затем во временной таблице выполните
select d.biz_id, temp.adventure_id, d.id as deal_id
from daily_deals d
JOIN tmp1 temp ON d.title REGEXP temp.yes AND NOT_REGEXP temp.no;
Как я могу получить такой результат? Спасибо за любую помощь, я впервые использую SO.