MySQL在其他表的数组上使用过滤器表

时间:2018-09-22 11:54:58

标签: mysql sql arrays mariadb

我有两个表: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

2 个答案:

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

您不想将兴趣爱好列表存储为带分隔符的字符串有很多原因。这里是一些:

  • id是整数。数据应使用正确的类型存储,并且整数不是字符串。
  • 外键关系应正确声明。
  • SQL具有糟糕的字符串处理功能。
  • 管理列表所需的字符串函数会阻止优化器使用索引。
  • SQL具有用于存储列表的非常好的数据结构。它称为,而不是 string

答案 1 :(得分:1)

您最好的选择是标准化您的数据。在SQL中将数字集存储为以逗号分隔的列表被认为是有害的。为什么有害?

  • 由于无法使用索引进行搜索,因此无法很好地扩展
  • 更新数字集非常困难;考虑从2中删除1,2,3,4的问题。在SQL中是一团糟。

某些SQL变体支持更新功能。但是扩大问题仍然存在。 (不要对这个建议太冒犯:我们大多数人一次或一次都犯了这个数据库设计错误。)

个人资料和爱好之间存在多对多关系。因此,您需要一个名为profile_hobbie的表,其中有两列p_idh_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)

但是,戈登是对的。这使用了糟糕的字符串处理技巧。