MySQL 连接文本类型列中的特定子字符串

标签 mysql join left-join inner-join

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 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

关于MySQL 连接文本类型列中的特定子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59783059/

相关文章:

php - 从文件创建 mysql 存储过程

ruby-on-rails - 如何计算具有一个或多个关联对象的记录数?

mysql - 如何在Mysql中根据日期过滤重复的行?

sql - 不支持 LEFT JOIN SQL 连接表达式

php - 计算总数

php - 尝试使用 cpulimit 限制 apache 的 cpu 使用,但我可以看到它仍然超出了我的限制

python - 有没有办法将多种日期格式转换为日期时间python

php - MySql 结果显示 id 号而不是单词

python - Pandas dataframe merge 的性能并不比附加到新列表更好

MySQL 查询对表进行联接,其中第二个表名称来自第一个表中的列