MySQL多个条件并在匹配时添加到计数器

时间:2017-03-01 09:42:31

标签: mysql sql

我有以下的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

有人可以帮我修改这个特定的查询吗? 谢谢:))

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)

您的根本问题是您将数字列表存储在字符串中。这是错误的,错误的,错误的,错误的,错误的。为什么呢?

  • 数字应存储为数字,而不是字符串。
  • SQL的字符串功能很差。
  • SQL具有用于存储列表的出色数据类型。这是一个叫做桌子的人。使用一个!
  • 引擎无法很好地优化查询。
  • 如果这些是另一个表中的id,那么您应该具有正确的,声明的外键关系。

有时其他人会做出非常非常糟糕的设计决策。而且,我们最终坚持使用它们。对于这种情况,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