首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL在其他表阵列上使用过滤器表

MySQL在其他表阵列上使用过滤器表
EN

Stack Overflow用户
提问于 2018-09-22 11:54:58
回答 2查看 54关注 0票数 0

我有两张桌子: profile和hobbie

每个配置文件都可以在profile.p_hobbies中作为id数组(例如:1、5、7、8、9)进行选择。

现在我想知道侧写人的名字。我认为这应该是某种联系:

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-22 12:16:27

在MySQL中不存在数组类型。您的数据结构有问题。您应该有一个关联/连接表,每个用户和业余爱好都有一行。就像这样:

代码语言:javascript
运行
复制
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)
);

行将如下所示:

代码语言:javascript
运行
复制
profileHobbieId   profileId   HobbieId
       1              1           1
       2              1           3
       3              1           5

那么您的查询将类似于:

代码语言:javascript
运行
复制
SELECT h.h_name
FROM profileHobbies ph JOIN
     hobbie h
     ON ph.hobbie_id = h.hobbie_id
WHERE ph.profile_id = 37 ;

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

  • ids是整数。数据应该使用正确的类型存储,整数不是字符串。
  • 外键关系应正确声明。
  • SQL具有糟糕的字符串处理能力。
  • 管理列表所需的字符串函数防止优化器使用索引。
  • SQL有一个非常好的存储列表的数据结构。它被称为表,而不是字符串。
票数 3
EN

Stack Overflow用户

发布于 2018-09-22 12:27:33

你最好的选择是规范化你的数据。在SQL中,将一组数字存储为逗号分隔的列表是有害的。为什么有害?

  • 它不能很好地扩展,因为它不能使用索引来搜索
  • 更新数字集很困难;请考虑从2中删除1,2,3,4的问题。这是SQL中的一片混乱。

一些SQL变体支持更新函数。但规模扩大的问题仍然存在。(不要对这个建议太生气:我们大多数人都曾经犯过这样或那样的数据库设计错误。)

你在个人资料和爱好之间有很多到很多的关系。因此,您需要一个名为profile_hobbie的表,其中包含两个列,p_idh_id。当概要文件开始执行业余爱好时,您可以将一行插入到profile_hobbie中,其中包含配置文件和业余爱好的id。如果配置文件不再做业余爱好,则删除该行。

那么您的查询将如下所示:

代码语言:javascript
运行
复制
  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

这将产生一个(可能是空的)列表,列出所选个人资料的爱好。

您也可以尝试使用集()函数,但是您可能会遇到整数和字符串之间的转换问题。

代码语言:javascript
运行
复制
   SELECT hobbie.h_name
     FROM profile
     JOIN hobbie ON (FIND_IN_SET(hobbie.h_id, profile.p_hobbies) > 0)

但是戈登是对的。这使用了一个糟糕的字符串处理黑客。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52456450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档