我在单个查询中尝试多个连接以从多个表中提取数据。
表格 - Places_main
,User_interests
,travel_list
User_interests
表格数据
ID USERID INTERESTID
84 27 |18|
85 27 |18|
Places_main
表数据
ID TAGS
1 |5|18|35|34|33
2 |5|18|35|33|34
我想要点到这里:
从Places_main表中获取不在travel_list中的地点列表,对于places_main的“tags”列,在interestID列的User_interests表中有一个条目。
这是查询1
select * from places_main pm
LEFT JOIN travel_list tl ON pm.ID = tl.PLACEID
LEFT JOIN user_interests ui ON pm.TAGS NOT LIKE '%' || ui.interestid || '%'
where tl.ID is null and ui.ID is null
这是与上述相同但具有硬编码数据的查询2
select * from places_main pm
LEFT JOIN travel_list tl ON pm.ID = tl.PLACEID
LEFT JOIN user_interests ui ON pm.TAGS NOT LIKE '%18%'
where tl.ID is null and ui.ID is null
当我使用硬编码值执行查询时,它会返回预期的结果,但是当我在没有硬编码(第一次查询)的情况下运行时,它什么都不返回。
如何在不使用硬编码值的情况下获得预期结果。
提前感谢您的帮助。
修改
如果我删除管道表格数据并将其作为单个值进行比较,它可以正常工作。但是在管道中它会返回空的。对此有任何建议。
答案 0 :(得分:2)
首先,你不应该存储这样的标签。您应该规范化表格,以便每行存储一个标记。然后剩下要做的就是一个简单的连接:
create table user_interests (
id int,
userid int,
interestid int
);
insert into user_interests values
(84 , 27 ,18),
(85 , 27 ,18);
create table places_main (
id int,
tag int
);
insert into places_main values
(1,5), (1,18), (1,35), (1,34), (1,33),
(2,5), (2,18), (2,35), (2,33), (2,34);
select *
from places_main p
join user_interests u on p.tag = u.interestid;
对于您当前的设计,这是一个丑陋的解决方案:
create table places_main (
id int,
tags varchar(100)
);
insert into places_main values
(1,'|5|18|35|34|33'),
(2,'|5|18|35|33|34');
select *
from places_main p
left join user_interests u
on concat('|', p.tags, '|') like concat('%|', u.interestid, '|%');