如何解决子查询,临时表,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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。