MySQL从text类型的coulmn连接特定子字符串
列shop_标记为int类型,列请求为text类型,包含jSON字符串 现在我想在从两列中提取123456之后连接这两个表 我正在尝试,但没有帮助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
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)