【问题标题】:How to check whether a value exists in an array that is stored in the database如何检查存储在数据库中的数组中是否存在值
【发布时间】:2019-06-07 01:20:27
【问题描述】:

我有一个数据库,其中时刻包含用户 ID 和朋友 ID。朋友 ID 被保存为一个数组。我有一个页面应该显示所有的时刻。我想检查包含某个 id 的时刻。例如,我自己制作了一个时刻,所以我的 id 在字段 user_id 中,但我的一个朋友也创建了一个时刻,所以我在friend_ids 中。现在我需要在这个页面上检查我的 id 是否出现在 user_id 或friend_ids 表中。如何检查数据库中的数组中是否存在值?我是否必须获取所有记录并遍历它们以检查数组还是有更好的方法?

数组在数据库中是这样的:

[2,3]   

这就是我的数据库架构现在的样子,我还没有设置表之间的任何关系。

【问题讨论】:

  • 这个数组在数据库中是如何表示的?
  • 我把它添加到我的问题@Mureinik
  • 您的数据库设计似乎很糟糕。保存为数组是一个坏主意,尤其是当您尝试在此类列上应用条件时。您应该考虑多对多关系(将 user_id 和friend_id 保存在数据透视表中)。你能改变数据库结构吗?
  • 所以,只是为了确保我理解。单个用户正在创建一个时刻(表示为 user_id),并且他可以将此时刻与他的朋友(存储在friend_ids 中)相关联?
  • 检查我的建议。

标签: php mysql sql arrays select


【解决方案1】:

作为一般建议,这不是在数据库中存储内容的好方法。您最好创建一个连接表来保存每对用户的友谊状态。

如果你不能这样做,你可以去掉第一个和最后一个字符([]),并在剩余的逗号分隔字符串上使用 find_in_set

SELECT *
FROM   mytable
WHERE  SELECT FIND_IN_SET(123, TRIM(TRAILING ']' FROM TRIM(LEADING '[' FROM friend_ids))) > 0
-- Just an example -------^ 

【讨论】:

  • 那么更好的方法是将moment_id保存在表users中?
【解决方案2】:

就像 Mureinik 建议的那样,尽管他为您的问题提供了解决方案,但您最好更好地表示您的数据。 随着时间的推移,friends_ids 字段会变得非常大,并且会影响性​​能。

在下图中,您可以看到我如何获取 *_ids 列并为每个列设置一个专用的数据透视表,这样您就可以通过添加 JOIN 子句轻松获得您的朋友。

尝试阅读有关模型或实体关系的更多信息(您可以在 Laravel 文档中找到很好的示例)

如果您有任何问题,请告诉我。

【讨论】:

  • 感谢您的时间和帮助。我理解该图,并且我认为这确实比在数据库中存储数组更好地解决了我的问题。如果我是对的,我可以在 Laravel 中定义关系,对吗?因为这个项目是用 Laravel 做的。
  • 是的,这很容易:) 不客气
  • imgur.com/1P10ngu 只是为了确定,我必须这样看吗?如果是这样,我是否必须像这里laravel.com/docs/5.7/eloquent-relationships 那样设置关系?
  • 我想我已经在用户和时刻之间建立了一个 belongsToMany 关系。关于如何测试它是否正常工作并检查我是否做对的任何想法? @MyLibary
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多