如何匹配两个表,直到表1行的值在表2列中匹配3次

时间:2018-07-19 01:08:04

标签: mysql

我有两个表,表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

2 个答案:

答案 0 :(得分:1)

这里的技巧是表table1table2之间的联接。

LIKE与通配符一起使用将不起作用。

示例:这将无效,因为它将错误地将100001,5000050001连接起来。

...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”:

  1. 作为字符串,因此,请处理此数据
  2. 在其他字段中分隔(由于项目数量可能会有所不同,我建议您使用另一个表格)

这样做之后,只会执行sql搜索。

示例:

SELECT error, count(*) count FROM table1 JOIN table2 GROUP BY 1;