我有以下的Mysql查询,我想添加一个计数器,显示每行的匹配数量。
select id, selection
FROM tablename
WHERE (selection LIKE '%13%' OR selection LIKE '%17%' OR
selection LIKE '%19%' OR selection LIKE '%73%')
最终目标是输出每一行的计数,过滤结果只有两个或更多匹配。
以下是表格中的示例数据:
id - 选择
1 - 3,5,19,23
2 - 13,17,34,45
我正在寻找的是返回一个结果集,其中所有行至少有2个数字,其中有多少匹配
例如:
id - 选择 - 计数
4 - 13,17,26,56 - 2
56 - 13,17,19,40 - 3
105 - 12,17,24,73 - 2
有人可以帮我修改这个特定的查询吗? 谢谢:))
答案 0 :(得分:0)
我认为你期待像这样的代码
Select id, COUNT(*) as count from (select id,selection
FROM Test
WHERE (selection LIKE '%13%' OR selection LIKE '%17%' OR
selection LIKE '%19%' OR selection LIKE '%73%')
group by id,selection) t group by id having COUNT(*) >= 2
答案 1 :(得分:0)
您的根本问题是您将数字列表存储在字符串中。这是错误的,错误的,错误的,错误的,错误的。为什么呢?
有时其他人会做出非常非常糟糕的设计决策。而且,我们最终坚持使用它们。对于这种情况,MySQL有一个名为find_in_set()
的便捷函数。您可以将其用作:
select id, selection
from tablename
where find_in_set(13, selection) > 0 or
find_in_set(17, selection) > 0 or
find_in_set(19, selection) > 0 or
find_in_set(73, selection) > 0 ;
如果要测试多个匹配项,可以计算匹配的数字。 MySQL通过将布尔表达式视为整数来简化这一过程:
select id, selection
from tablename
where ( (find_in_set(13, selection) > 0) +
(find_in_set(17, selection) > 0) +
(find_in_set(19, selection) > 0) +
(find_in_set(73, selection) > 0)
) >= 2