【问题标题】:How to get the value of specific index inside an array column using mysql?如何使用mysql获取数组列中特定索引的值?
【发布时间】:2018-11-14 07:35:27
【问题描述】:

$reports = DB::table('attendance_report_details')
            ->select('*','project_hours[$index_id]')
            ->get();

我将索引 id 传递给函数。有没有办法做到这一点?

【问题讨论】:

  • Possibly。但是为什么要以这样的非关系格式存储数据呢?
  • 我将数据存储为 json 编码数据
  • 我知道你是,我看得出来。我的问题是为什么你这样做,而不是创建一个适当的关系结构?
  • 因为项目时间与对应的项目有关。每个att_rep_id的项目顺序可能不同。此外,旧项目可能会被删除。所以它需要像这样存储它。
  • 这些都不会阻止您使用单独的表和外键来构建正确的结构。如果你这样做了,你可以通过存储小时数的项目小时表和员工表和项目表的外键建立多对多关系,将员工表链接到项目表。然后使用 SQL 编写查询以获取特定时间是微不足道的。如果您没有意识到这种事情,也许您首先需要更详细地研究数据库设计?

标签: php mysql laravel laravel-5


【解决方案1】:

使用箭头运算符(仅限 MySQL):

$reports = DB::table('attendance_report_details')
    ->select('*', DB::raw("project_hours->'$[".(int) $index_id."]'"))
    ->get();

或其别名JSON_EXTRACT()(MySQL 和 MariaDB):

$reports = DB::table('attendance_report_details')
    ->select('*', DB::raw("json_extract(project_hours, '$[".(int) $index_id."]')"))
    ->get();

【讨论】:

  • Nope.. :( 我收到一个错误。对于第一个解决方案,错误是“语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的对应的手册MariaDB 服务器版本,用于在第 1 行的 attendance_report_details' 的 '>'$[1]' 附近使用正确的语法
  • 第二种方案:json函数只能在mariaDB 10.2.3及以上版本中使用。我的版本是 10.1.36。我正在使用 xampp
  • 无论如何,谢谢你的回答:) @Jonas Staudenmeir
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
相关资源
最近更新 更多