【问题标题】:Mysql query WHERE column is in json arrayMysql查询WHERE列在json数组中
【发布时间】:2015-02-11 11:23:03
【问题描述】:

我已经设置了一个查询,它可以选择多个事物。

$stm = $db->query('SELECT startUser, forUser, percentage, time, taskTitle, taskDesc, color FROM admin_task WHERE forUser = "'.$queryanswer.'")');

但是对于数据库中的用户是这样的:

["demo","   user"]

如何检查 forUser(上面的 json 数组)是否有演示?我可以检查一下吗?

【问题讨论】:

  • 这不是将 json 放入数据库的理想选择,除非该工具适用于它,例如 mongodb
  • 这可能不是“理想的”,但在 SQL 数据库中序列化数据是一种很常见的做法。
  • 是的,但是如果您需要访问序列化块内的各个数据位,那么您的数据库设计很糟糕,不应该首先将数据序列化....或至少使用原生理解该 json 的数据库。
  • 好的,但是还有什么可以使用的。如果涉及到 8 个用户,如何将他们排列到一个 db 中?

标签: php mysql sql json


【解决方案1】:

我认为你只能在 Mysql 5.7 中实现这一点。

在 5.7 版中,您可以执行以下操作:

SELECT JSON_EXTRACT(json_field, '$.name');

它只会从 json 对象中提取 name 键

搜索所有带有“JavaScript”标签的项目:

SELECT * FROM `table` WHERE JSON_CONTAINS(json_field, '["JavaScript"]');

查找标签以“Java”开头的所有项目:

SELECT * FROM `table` WHERE JSON_SEARCH(json_field, 'one', 'Java%') IS NOT NULL;

使用“one”查找第一个匹配项或使用“all”查找所有匹配项

您可以使用 JSON 路径提取 Twitter 昵称:

SELECT name, json_field->"$.twitter" AS `twitter` FROM `user`;

您还可以在 WHERE 子句中引用 JSON 路径以仅返回具有 Twitter 帐户的用户:

SELECT name, profile->"$.twitter" AS `twitter` FROM `user` WHERE profile->"$.twitter" IS NOT NULL;

你可以做更多的事情,比如:

  • 创建 JSON 值

  • JSON 值的规范化、合并和自动包装

  • 搜索和修改 JSON 值

  • JSON 值的比较和排序

  • JSON 值聚合

更多信息请参考:https://dev.mysql.com/doc/refman/5.7/en/json.html

【讨论】:

    【解决方案2】:

    如果它确实是一个 JSON 字段,在 5.7 中你可以这样做:

    SELECT
      startUser,
      forUser,
      percentage,
      time,
      taskTitle,
      taskDesc,
      color
    FROM admin_task
    WHERE JSON_CONTAINS(forUser->'$[*]', JSON_ARRAY("somestring"))
    

    【讨论】:

      【解决方案3】:
      SELECT startUser, 
      forUser, 
      percentage, 
      time, 
      taskTitle, 
      taskDesc, 
      color 
      FROM admin_task WHERE JSON_SEARCH(forUser -> '$[*]', 'one', 'demo');
      

      【讨论】:

      • 添加一些 cmets 来解释它为什么/如何工作将增加答案的长期价值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多