子查询,临时表,mysql变量或从一个表中的列获取pos和neg搜索项以查询另一表的过程

我要通过一组冒险关键字术语查询交易标题表,并在与冒险相关的一个术语出现在标题中时标记相关的冒险。为了以最少的查询量将多个冒险与多个交易进行匹配,我将其分解为两个步骤: 我创建了一个临时表,将每个冒险的所有搜索词加入到由“ | \”连接的一列中,以便可以在正则表达式中使用它。 将此临时表与Deals.title正则表达式临时连接的搜索词上的Deals表一起加入。 这很好用,但是我有两个问题: 我可以在子查询中执行此操作而不创建临时表吗? 我想在我的搜索字词表中引入一种状态,将搜索字词分类为否定或肯定。然后,我想搜索交易标题并仅在标题中包含一个或多个肯定项且标题中没有否定项时返回匹配项。我无法弄清楚如何从同一张表中获取两种不同状态的结果,然后使用结果来联接/查询另一张表。我该怎么做呢??我尚未将变量或存储过程与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为status = yes SEPARATOR \'| \')为
**yes**
和GROUP_CONCAT(st.term(即status = no)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。     
已邀请:
              我可以在子查询中执行此操作而不创建临时表吗?    通常,您可以使用派生查询替换临时表,例如
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; 
    
        \“我希望能够说GROUP_CONCAT(st.term为status =是SEPARATOR \'| \')为是,而GROUP_CONCAT(st.term为(status = no)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
    

要回复问题请先登录注册