MySQL从text类型的coulmn连接特定子字符串

MySQL从text类型的coulmn连接特定子字符串,mysql,join,left-join,inner-join,Mysql,Join,Left Join,Inner Join,列shop_标记为int类型,列请求为text类型,包含jSON字符串 现在我想在从两列中提取123456之后连接这两个表 我正在尝试,但没有帮助 SHOPS +----+---------------+ | id | shop_tag | +----+---------------+ | 1 | 1234560000000 | +----+---------------+ LOGS +----+-------------------------------------+ | id

列shop_标记为int类型,列请求为text类型,包含jSON字符串

现在我想在从两列中提取123456之后连接这两个表

我正在尝试,但没有帮助

SHOPS
+----+---------------+
| id |   shop_tag    |
+----+---------------+
| 1  | 1234560000000 |
+----+---------------+

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

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

如果您使用的是MySQL 5.7.13+,您可以使用JSON函数从
request
列中提取
标记
值,并直接比较剩下的6个字符:

SELECT logs.id FROM logs INNER JOIN shops ON left(shops.shop_tag,6) = left(right(logs.request,6),26)
注意:根据表的排序规则,您可能不需要条件中的
二进制文件


您可以使用内置函数
JSON\u EXTRACT

SELECT JSON_EXTRACT('{“key”:“123”,“tag”:“123456*****”}','$.key')`key`
输出:


|钥匙|
+-------+
|"123"  |

您使用的是什么版本的MySQL?可能
{“key”:“123”,“tag”:“123456****”}
{“tag”:“123456****”,“key”:“123”}
是不同的。@Nick MySQL版本是5.7.26这非常好用。我假设JSON函数只在JSON类型的列上工作。谢谢你的帮助。另外,如果您能指出为什么即使联接条件返回相同的值,我的查询也不起作用?@nikhil.malik no-它们可以处理任何合法的JSON值,而不管列类型如何(或在变量中)。我很高兴我能帮上忙。@nikhil.malik您需要
left(right(logs.request,13),6)
请参见,但是使用JSON函数是goThanx指出这一点的更可靠的方法。从现在起将使用JSON函数。
SELECT *
FROM SHOPS s
JOIN LOGS l ON BINARY LEFT(l.request->>'$.tag', 6) = BINARY LEFT(s.shop_tag, 6)