根据 ActiveRecord 中的另一个数组查询 mysql json 数组
Querying a mysql json array against another array in ActiveRecord
我正在尝试查询 mysql 数据库。我只需要 return 存在于外部数组中的值:
query_data = tours.select(:orders)
=> [#<Tour:0x007fd1b0972438 orders: [223597]>, ...]
我有一个如下所示的外部数组:orders = [223597, 223598]
现在,我正在使用 ruby 来过滤数据,但它没有我想要的那么有效:
query_data = query_data.find_all do |data|
data.orders.any? { |o| orders.include?(o) }
end
所以我的问题是,如何根据订单数组检查数据库数组,并且只使用 SQL 在数据库数组中仅 return 具有这些 ID 的记录?
我正在尝试这样的事情,但我认为这不是正确的方法:
query_data.where("JSON_EXTRACT('tour.orders', '$[*]') IN #{orders}")
此外,它只是直接行不通。
版本:
Ruby: 2.3.1
mysql: mysql Ver 14.14 Distrib 5.7.29, for osx10.14 (x86_64) using EditLine wrapper
Rails: 5
在 SQL 查询的 WHERE 子句中使用 JSON_EXTRACT()
保证它将无法使用索引。所以它会做一个table-scan,效率不高。
一般来说,我向在数据库中有 JSON 列的开发人员推荐:
您可以在 SELECT-列表中提取 JSON 文档的一部分:
SELECT JSON_EXTRACT(tour.orders, '..expr..') FROM ...
但不要在 SQL 查询的任何其他子句中这样做。不在 WHERE 子句中,也不在 JOIN 表达式中,也不在 GROUP BY、ORDER BY、HAVING 等中。有很多情况无法优化,这会使您的 SQL 查询超级复杂,难以优化代码,难读,难维护。
相反,如果您想与 JSON 数组的各个元素进行比较,您应该以规范化的方式存储它们,子 table 中每行一个项目。
例如,您可能有一个 table tour_orders
,其中每一行都有一个对 tour.id
的引用和一个订单 ID。然后你可以用更易读的方式查询它:
query_data.where(order: orders)
在 MySQL 中使用 JSON 数据类型可以轻松插入大量数据,但会使许多类型的查询变得更加困难。如果您需要 SQL 表达式来访问 JSON 文档的各个元素,我建议避免使用 JSON 数据类型。
我正在尝试查询 mysql 数据库。我只需要 return 存在于外部数组中的值:
query_data = tours.select(:orders)
=> [#<Tour:0x007fd1b0972438 orders: [223597]>, ...]
我有一个如下所示的外部数组:orders = [223597, 223598]
现在,我正在使用 ruby 来过滤数据,但它没有我想要的那么有效:
query_data = query_data.find_all do |data|
data.orders.any? { |o| orders.include?(o) }
end
所以我的问题是,如何根据订单数组检查数据库数组,并且只使用 SQL 在数据库数组中仅 return 具有这些 ID 的记录?
我正在尝试这样的事情,但我认为这不是正确的方法:
query_data.where("JSON_EXTRACT('tour.orders', '$[*]') IN #{orders}")
此外,它只是直接行不通。
版本:
Ruby: 2.3.1
mysql: mysql Ver 14.14 Distrib 5.7.29, for osx10.14 (x86_64) using EditLine wrapper
Rails: 5
在 SQL 查询的 WHERE 子句中使用 JSON_EXTRACT()
保证它将无法使用索引。所以它会做一个table-scan,效率不高。
一般来说,我向在数据库中有 JSON 列的开发人员推荐:
您可以在 SELECT-列表中提取 JSON 文档的一部分:
SELECT JSON_EXTRACT(tour.orders, '..expr..') FROM ...
但不要在 SQL 查询的任何其他子句中这样做。不在 WHERE 子句中,也不在 JOIN 表达式中,也不在 GROUP BY、ORDER BY、HAVING 等中。有很多情况无法优化,这会使您的 SQL 查询超级复杂,难以优化代码,难读,难维护。
相反,如果您想与 JSON 数组的各个元素进行比较,您应该以规范化的方式存储它们,子 table 中每行一个项目。
例如,您可能有一个 table tour_orders
,其中每一行都有一个对 tour.id
的引用和一个订单 ID。然后你可以用更易读的方式查询它:
query_data.where(order: orders)
在 MySQL 中使用 JSON 数据类型可以轻松插入大量数据,但会使许多类型的查询变得更加困难。如果您需要 SQL 表达式来访问 JSON 文档的各个元素,我建议避免使用 JSON 数据类型。