我有两张桌子: profile和hobbie
每个配置文件都可以在profile.p_hobbies中作为id数组(例如:1、5、7、8、9)进行选择。
现在我想知道侧写人的名字。我认为这应该是某种联系:
SELECT hobbie.h_name
FROM profile, hobbie
WHERE profile.p_id=37 AND hobbie.h_id IN profile.p_hobbies结果是失败#1064
#1064 - Fehler in der SQL-语法。在Zeile 3中,Bitte die korrekte Syntax nachschlagen bei 'profile.p_hobbies LIMIT 0,25‘
我已经在其他SQL-Querys中使用了IN方法。如果我想使用的数组也是来自SQL数据库的数据,我想我就不能使用它了?
不需要使用多个查询,我还能做些什么吗?
我用的是MariaDB-9
发布于 2018-09-22 12:16:27
在MySQL中不存在数组类型。您的数据结构有问题。您应该有一个关联/连接表,每个用户和业余爱好都有一行。就像这样:
create table profileHobbies (
profileHobbieId int auto_increment primary key,
profileId int,
hobbieId int,
foreign key (profileId) references profiles(profileId),
foreign key (hobbieId) references hobbies(hobbieId)
);行将如下所示:
profileHobbieId profileId HobbieId
1 1 1
2 1 3
3 1 5那么您的查询将类似于:
SELECT h.h_name
FROM profileHobbies ph JOIN
hobbie h
ON ph.hobbie_id = h.hobbie_id
WHERE ph.profile_id = 37 ;您不想将兴趣爱好列表存储为分隔字符串的原因有很多。以下是一些:
发布于 2018-09-22 12:27:33
你最好的选择是规范化你的数据。在SQL中,将一组数字存储为逗号分隔的列表是有害的。为什么有害?
2中删除1,2,3,4的问题。这是SQL中的一片混乱。一些SQL变体支持更新函数。但规模扩大的问题仍然存在。(不要对这个建议太生气:我们大多数人都曾经犯过这样或那样的数据库设计错误。)
你在个人资料和爱好之间有很多到很多的关系。因此,您需要一个名为profile_hobbie的表,其中包含两个列,p_id和h_id。当概要文件开始执行业余爱好时,您可以将一行插入到profile_hobbie中,其中包含配置文件和业余爱好的id。如果配置文件不再做业余爱好,则删除该行。
那么您的查询将如下所示:
SELECT hobbie.h_name
FROM profile
JOIN profile_hobbie ON profile.p_id = profile_hobbie.p_id
JOIN hobbie ON profile_hobbie.id = hobbie.h_id
WHERE profile.p_id=37这将产生一个(可能是空的)列表,列出所选个人资料的爱好。
您也可以尝试使用集()函数,但是您可能会遇到整数和字符串之间的转换问题。
SELECT hobbie.h_name
FROM profile
JOIN hobbie ON (FIND_IN_SET(hobbie.h_id, profile.p_hobbies) > 0)但是戈登是对的。这使用了一个糟糕的字符串处理黑客。
https://stackoverflow.com/questions/52456450
复制相似问题