Mysql 函数根据多个查询在一列中返回多个值
我即将构建一个通知功能 该应用程序是一个汽车广告网站 经销商插入汽车广告 访问者可以将搜索保存为字符串URL 当经销商插入新车时,我将所有保存的搜索解析为SQL查询 对于每个保存的搜索查询,我检查搜索结果中是否包含新车。如果是,我会发送电子邮件通知访客 我不知道如何构建一个返回相关已保存搜索id的查询,而不是逐个运行所有查询 下面是我要翻译的最接近的表达Mysql 函数根据多个查询在一列中返回多个值,mysql,sql,Mysql,Sql,我即将构建一个通知功能 该应用程序是一个汽车广告网站 经销商插入汽车广告 访问者可以将搜索保存为字符串URL 当经销商插入新车时,我将所有保存的搜索解析为SQL查询 对于每个保存的搜索查询,我检查搜索结果中是否包含新车。如果是,我会发送电子邮件通知访客 我不知道如何构建一个返回相关已保存搜索id的查询,而不是逐个运行所有查询 下面是我要翻译的最接近的表达 CREATE FUNCTION get_saved_search_id(query, id){ if(query){ return
CREATE FUNCTION get_saved_search_id(query, id){
if(query){
return id;
}
}
SELECT get_saved_search_id('EXISTS(SLECT car_id FROM Car WHERE type=0 AND price <= 10000 AND color = red)', 0)
UNION
SELECT get_saved_search_id('EXISTS(SLECT car_id FROM Car WHERE type=2 AND price <= 15000 AND color = black) ', 1)
UNION
SELECT get_saved_search_id('EXISTS(SLECT car_id FROM Car WHERE type=3 AND price <= 20000 AND color = white)', 2)
您可以使用交叉联接,生成一个庞大的WHERE/OR子句,而不是EXISTS子句,并为每个保存的搜索id设置一个条件,如下所示:
SELECT saved_search_id,
visitor_id,
car_id
FROM searches a
CROSS JOIN cars b
-- generated WHERE clause below based on saved_search_id + search_url column
WHERE (saved_search_id = 0 AND type = 0 AND price <= 10000 AND color = 'red')
OR (saved_search_id = 1 AND type = 2 AND price <= 15000 AND color = 'black')
OR (saved_search_id = 2 AND type = 3 AND price <= 20000 AND color = 'white')
编辑:例如,在插入的车辆id 10上添加过滤器
SELECT saved_search_id,
visitor_id,
car_id
FROM searches a
CROSS JOIN cars b
-- generated WHERE clause below based on saved_search_id + search_url column
WHERE (
(saved_search_id = 0 AND type = 0 AND price <= 10000 AND color = 'red')
OR (saved_search_id = 1 AND type = 2 AND price <= 15000 AND color = 'black')
OR (saved_search_id = 2 AND type = 3 AND price <= 20000 AND color = 'white')
)
AND car_id = 10 --<-- inserted car id
经销商插入一辆具有特定@type、@price和@color的新车。使用以下参数查找相关搜索:
select *
from searches
where search_url like concat('type=', @type, '%color=', @color)
and cast(substring_index(search_url, '&price_max=', -1) as int) >= @price;
在MySQL中强制转换为整数只接受数字,忽略字符串的其余部分
如果要使用已插入的车辆行:
select *
from searches s
where exists
(
select null
from cars c
where c.id = 12345 -- the inserted row's ID
and s.search_url like concat('type=', c.type, '%color=', c.color)
and cast(substring_index(s.search_url, '&price_max=', -1) as int) >= c.price
);
当然,您也可以为此编写一个函数,接受搜索字符串和汽车参数,或者已经插入的汽车行的汽车ID。对于后者,您将得到如下结果:
select *
from searches s
where search_matches_car(s.search_url, 12345);
对于要查看汽车信息的情况,连接也是如此:
select *
from cars c
join searches s on search_matches_car(s.search_url, c.id)
where c.id = 12345;
请看,您不认为插入的汽车id与查询有关吗?如果上次插入的id=10,则汽车id=10笛卡尔连接和搜索限制意味着您将检索符合条件的所有汽车id,因此您将获得相关的搜索id、访客id和汽车id。我甚至在一把小提琴上测试了这一点。假设您知道插入的car id,那么您可以简单地将该附加过滤器添加到返回的结果中,即在将整个OR条件集括起来之后添加一个AND car_id=inserted_car_id子句。
select *
from searches s
where search_matches_car(s.search_url, 12345);
select *
from cars c
join searches s on search_matches_car(s.search_url, c.id)
where c.id = 12345;