如何在sql

时间:2017-05-08 06:44:50

标签: mysql sql join sql-like

我在单个查询中尝试多个连接以从多个表中提取数据。

表格 - Places_mainUser_intereststravel_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

当我使用硬编码值执行查询时,它会返回预期的结果,但是当我在没有硬编码(第一次查询)的情况下运行时,它什么都不返回。

如何在不使用硬编码值的情况下获得预期结果。

提前感谢您的帮助。

修改

如果我删除管道表格数据并将其作为单个值进行比较,它可以正常工作。但是在管道中它会返回空的。对此有任何建议。

1 个答案:

答案 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;

Demo normalized

对于您当前的设计,这是一个丑陋的解决方案:

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, '|%');

Demo