我有两个表,表1如下
session status SN error_code
3f24197394c521349206a11 Fail ACNW6676 40774,500005
7385122219fa35c37942511 Fail ACNW6676 40555,40187,500004,500005
412afc12a33601011721415 Fail ACNW6676 100001,500005
9213232191116c821a59f86 Fail ACNW6676 500005
和下面的表2
error
0001
500005
40774
如果我想对表2(错误)进行对照表1(错误代码)的检查,如果匹配3次将返回1。 例如, 表2的500005匹配表1(error_code)的3倍显示错误代码和匹配的数量。 表1 500005和40774中的错误不能将匹配数相加。表示表2中的每个单个值都被分隔
对此有任何想法吗?
想要的结果:-
error count
500005 4
40774 1
如果3以上的计数返回1
答案 0 :(得分:1)
这里的技巧是表table1
和table2
之间的联接。
将LIKE
与通配符一起使用将不起作用。
示例:这将无效,因为它将错误地将100001,500005
与0001
连接起来。
...from table1 join table2 ON table1.error_code LIKE concat('%', table2.error, '%')
相反,有必要检查table2.error
中整个词是否包含table1.error_code
。可以使用正则表达式来表达。
\b
表示单词边界的正则表达式
\bword\b
将与文本匹配
this sentence has a word in it
但与文本不匹配
this sentence is made with words
mysql使用这些标记来表示单词边界
[[:<:]], [[:>:]]
因此我们这样构造查询
SELECT
error
, count(*) count
FROM table1
JOIN table2
ON error_code REGEXP CONCAT('[[:<:]]', error, '[[:>:]]')
GROUP BY 1;
应该应该产生行:
+--------+----------+
| error | count(*) |
+--------+----------+
| 40774 | 1 |
| 500005 | 4 |
+--------+----------+
答案 1 :(得分:0)
首先,您必须确保组织数据! 如果您在sql中执行此操作,则应输入“ 40774,500005”:
这样做之后,只会执行sql搜索。
示例:
SELECT error, count(*) count FROM table1 JOIN table2 GROUP BY 1;