【问题标题】:MySQL join on specific substring from a coulmn of type textMySQL加入文本类型列中的特定子字符串
【发布时间】:2020-01-17 07:42:27
【问题描述】:
SHOPS
+----+---------------+
| id |   shop_tag    |
+----+---------------+
| 1  | 1234560000000 |
+----+---------------+

LOGS
+----+-------------------------------------+
| id |             request                 |
+----+-------------------------------------+
| 1  |  {"key":"123","tag":"123456*****"}  |
+----+-------------------------------------+

shop_tag列为int类型,text类型的日志请求列,包含json字符串。

现在我想在从两列中提取 123456 后加入这两个表。

我正在尝试这个但没有帮助

SELECT logs.id FROM logs INNER JOIN shops ON left(shops.shop_tag,6) = left(right(logs.request,6),26)

请注意,shop_tag 和 request 列的长度和结构都是固定的。

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • 可能{"key":"123","tag":"123456*****"} {"tag":"123456*****","key":"123"} 不一样。
  • @Nick MySQL 版本是 5.7.26

标签: mysql join left-join inner-join


【解决方案1】:

如果您使用的是 MySQL 5.7.13+,您可以使用 JSON 函数 ->>request 列中提取 tag 值,并直接比较左侧 6 个字符:

SELECT *
FROM SHOPS s
JOIN LOGS l ON BINARY LEFT(l.request->>'$.tag', 6) = BINARY LEFT(s.shop_tag, 6)

请注意,根据您的表的排序规则,您可能不需要 BINARY 条件。

Demo on dbfiddle

【讨论】:

  • 这很完美。我假设 JSON 函数仅适用于 JSON 类型的列。感谢您的帮助。另外,如果你能指出为什么即使连接条件返回相同的值,我的查询也不起作用?
  • @nikhil.malik 否 - 无论列类型(或变量中)如何,它们都可以处理任何合法的 JSON 值。我很高兴能帮上忙。
  • @nikhil.malik 你需要left(right(logs.request,13),6) 请参阅dbfiddle.uk/…,但使用 JSON 函数是一种更可靠的方法
  • 感谢您指出这一点。从现在开始将使用 JSON 函数。
【解决方案2】:

可以使用内置函数JSON_EXTRACT

SELECT JSON_EXTRACT('{"key":"123","tag":"123456*****"}', '$.key') `key`

输出:


|key    |
+-------+
|"123"  |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 2022-01-17
    • 2017-06-13
    • 1970-01-01
    • 2012-04-27
    • 2021-08-10
    • 2016-08-31
    • 2015-08-31
    相关资源
    最近更新 更多