我有两个表: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-费勒在der SQL语法中。在Zeile 3中将'profile.p_hobbies LIMIT 0,25'修改为'Handbuch nachschlagen bei'
我已经在其他SQL查询中使用IN方法。如果我要使用的数组也是SQL数据库中的数据,我想我不能使用它?
有没有不用多个查询就可以做的事情吗?
我正在使用MariaDB-9
答案 0 :(得分:3)
这个评论太长了。
MySQL中没有像数组类型这样的东西。您的数据结构有问题。您应该有一个 association / junction 表,每个用户和爱好一行。像这样:
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 ;
您不想将兴趣爱好列表存储为带分隔符的字符串有很多原因。这里是一些:
答案 1 :(得分:1)
您最好的选择是标准化您的数据。在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
这将为所选个人资料生成一个(可能为空)兴趣爱好列表。
您也可以尝试使用MySQL's FIND_IN_SET() function,但可能会遇到整数和字符串之间的转换问题。
SELECT hobbie.h_name
FROM profile
JOIN hobbie ON (FIND_IN_SET(hobbie.h_id, profile.p_hobbies) > 0)
但是,戈登是对的。这使用了糟糕的字符串处理技巧。