Подзапрос, временная таблица, переменные mysql или процедура, чтобы получить положительные и отрицательные условия поиска из столбца в одной таблице для запроса другой - PullRequest
2 голосов
/ 24 июня 2011

Я запрашиваю таблицу названий сделок по набору ключевых слов приключений и отмечаю связанные приключения, когда в названии присутствует один из терминов, связанных с приключением. Чтобы сопоставить несколько приключений с несколькими сделками в наименьшем количестве запросов, я разбил это на два этапа:

  1. Я создал временную таблицу для объединения всех поисковых терминов для каждого приключения в один столбец с конкатенацией "|" так что я могу использовать его в регулярном выражении.

  2. объедините эту временную таблицу с таблицей сделок по поисковым предложениям.

Это прекрасно работает, но у меня есть два вопроса:

  1. Можно ли сделать это в подзапросе без создания временной таблицы?

  2. Я хотел бы добавить в свою таблицу условий поиска статус, который классифицирует условия поиска как отрицательные или положительные. Тогда я хотел бы искать названия сделок и возвращать совпадения только в том случае, если в названии содержится один или несколько положительных терминов, а в названии - ни одного из отрицательных. Я не могу понять, как получить результаты двух разных типов состояния из одной и той же таблицы, а затем использовать результаты для соединения / запроса другой таблицы. Как мне это сделать?? Я еще не использовал переменные или хранимые процедуры с 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.

Ответы [ 2 ]

2 голосов
/ 24 июня 2011
  1. Можно ли сделать это в подзапросе без создания временной таблицы?

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

SELECT d.biz_id, 
       TEMP.adventure_id, 
       d.id AS deal_id 
FROM   daily_deals d 
       JOIN (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) TEMP 
         ON d.title REGEXP TEMP.MATCH; 
0 голосов
/ 27 июня 2011

"Я хочу иметь возможность сказать GROUP_CONCAT (st.term, которые имеют статус = да SEPARATOR '|') как да и GROUP_CONCAT (st.term (которые имеют статус = нет) SEPARATOR '|') как нет"

    SELECT d.title, matches.match, matches.match_neg 
    FROM   daily_deals d 
    JOIN (Select * from (SELECT  
                adventure_id, 
                GROUP_CONCAT(term SEPARATOR '|') AS `match` 
         FROM  search_terms 
         where status = 'yes'
         GROUP  BY adventure_id) as temp1
    left outer join
    (SELECT  
                adventure_id as adventure_id_neg, 
                GROUP_CONCAT(term SEPARATOR '|') AS `match_neg` 
         FROM  search_terms 
         where status = 'no'
         GROUP  BY adventure_id) as temp2
    on temp1.adventure_id = temp2.adventure_id_neg) as matches
    ON d.title REGEXP matches.match AND d.title REGEXP matches.match_neg
...