2017-03-01 90 views
0

我有以下的Mysql查询,我想添加一个计数器,显示每行匹配的数量。MySQL多个像条件和添加到计数器时匹配

select id, selection 
FROM tablename 
WHERE (selection LIKE '%13%' OR selection LIKE '%17%' OR 
     selection LIKE '%19%' OR selection LIKE '%73%') 

最终目标是输出每行的计数并过滤结果只有2个或更多匹配。

以下是表中的一个样本数据:

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

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

+1

添加一些示例表数据和预期结果。 (你可以通过只有两个不同的例如13和17来最小化你的问题。) – jarlh

回答

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 

0

你根本的问题是要存储号码清单中的字符串。这只是错误的,错误的,错误的,错误的,错误的。为什么?

  • 数字应该存储为数字而不是字符串。
  • SQL的字符串功能很差。
  • SQL有一个伟大的数据类型来存储列表。这是一个叫做表格。使用一个!
  • 引擎无法很好地优化查询。
  • 如果这些是ids到另一个表中,那么你应该有适当的,声明的外键关系。

有时其他人们做出真的很糟糕的设计决定。而且,我们最终陷入了困境。对于这种情况,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