【问题标题】:Querying fields containing multiple fields查询包含多个字段的字段
【发布时间】:2017-07-18 09:14:59
【问题描述】:

我需要从 MariaDB 源查询一个表。

有一个字段包含几个用逗号分隔的值,我不知道如何继续。

情况是这样的:

TABLE: Aphorisms_Categories
Field: id 

相关

TABLE: Aphorisms
Field: categories

问题是类别通常包含像 2、3、4、67 这样的字符串。

不知道为什么,最初的开发者决定不创建第三个表来表示 N-M 关系。但是现在,对我来说,不可能找到一种方法来检索属于类别 3 的所有格言(例如)。

有什么提示吗?

【问题讨论】:

  • 是否仍然可以选择添加额外的表并将值存储在那里?也许使用触发器在额外的表中插入/更新这些值,同时保持你的 php 代码大部分是完整的
  • 有一个字段包含多个用逗号分隔的值听起来像是糟糕的设计或只是错误的数据库

标签: php mysql mariadb


【解决方案1】:

Shirkam 的回答很接近,但有一个问题:

如果 3 是字段中的第一个或最后一个类别,即 '2,4,33,3',则 SELECT * FROM Aphorisms WHERE categories LIKE '%,3,%' 不会抓住它。如果您从 LIKE 子句中删除逗号,那么您将在多位数类别中得到误报。

由于您使用的是 MariaDB,因此请使用: SELECT * FROM Aphorisms WHERE categories REGEXP '(^|,)3($|,)'

【讨论】:

    【解决方案2】:

    你应该使用这样的东西:

    SELECT * FROM Aphorisms WHERE categories LIKE '%,3,%

    这样就可以了。

    PS:有时候,开发者不想有太多的关系,所以倾向于集中精力。有时它有用,有时没有,就像你的情况一样。

    【讨论】:

      【解决方案3】:

      唯一一个好的解决方案只能是你作为一名优秀程序员的责任:不仅要提供好的 php 代码,还要提供好的数据库设计。你现在有这个责任,不再是以前的开发者了。

      因此,我的建议是不要尝试应用 find-category-id 技巧,而是提供良好、可靠的数据库设计。就像您在问题中已经提出的那样。

      祝你好运!

      【讨论】:

      • 对于对我的问题投反对票的用户:请让我知道您投反对票的动机,以便我可以相应地更改我的答案。这样我们就可以共同为这个网站的持续改进做出贡献。
      • 很遗憾,我无法按照您的建议进行操作。数据库是我拥有的,我无法更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2020-07-14
      • 1970-01-01
      相关资源
      最近更新 更多