Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 函数根据多个查询在一列中返回多个值_Mysql_Sql - Fatal编程技术网

Mysql 函数根据多个查询在一列中返回多个值

Mysql 函数根据多个查询在一列中返回多个值,mysql,sql,Mysql,Sql,我即将构建一个通知功能 该应用程序是一个汽车广告网站 经销商插入汽车广告 访问者可以将搜索保存为字符串URL 当经销商插入新车时,我将所有保存的搜索解析为SQL查询 对于每个保存的搜索查询,我检查搜索结果中是否包含新车。如果是,我会发送电子邮件通知访客 我不知道如何构建一个返回相关已保存搜索id的查询,而不是逐个运行所有查询 下面是我要翻译的最接近的表达 CREATE FUNCTION get_saved_search_id(query, id){ if(query){ return

我即将构建一个通知功能 该应用程序是一个汽车广告网站 经销商插入汽车广告 访问者可以将搜索保存为字符串URL

当经销商插入新车时,我将所有保存的搜索解析为SQL查询

对于每个保存的搜索查询,我检查搜索结果中是否包含新车。如果是,我会发送电子邮件通知访客 我不知道如何构建一个返回相关已保存搜索id的查询,而不是逐个运行所有查询 下面是我要翻译的最接近的表达

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;