高效匹配最高类别
Efficiently match highest category
我有一个 table 的 6 位数字,范围为 0-9,我会将其与 6 个类别中的数字进行匹配
- 第一个数字匹配
- 前两个数字匹配
- 前三个数字匹配
- 前四位数字匹配
- 前五位数字匹配
- 所有号码都匹配
但只应选择最高类别。一个例子
人数:123456
- 如果号码是 [123]756 那么这将属于前三号码匹配类别
- 在号码 023456 上,这将不匹配
我为它创建了一个 fiddle https://www.db-fiddle.com/f/TZCrFPnJpkw4fyxA5Q6mR/1
什么是有效的方法?蛮力解决方案将是一个双循环,我想从 6 场比赛开始,5 场比赛,...
你可以这样做:
select *
from (
select 6 as score, b.* from bids b where ticketNumber like '123456%'
union all select 5, b.* from bids b where ticketNumber like '12345%'
union all select 4, b.* from bids b where ticketNumber like '1234%'
union all select 3, b.* from bids b where ticketNumber like '123%'
union all select 2, b.* from bids b where ticketNumber like '12%'
union all select 1, b.* from bids b where ticketNumber like '1%'
) x
order by score desc
limit 1
结果:
score id roundId address ticketNumber
------ --- -------- -------- ------------
6 1 1 12345 123456
参见 DB Fiddle 中的示例。
或者,您可以使用递归 CTE,但这在 MySQL 5.7 中不可用(正如您的 fiddle 暗示的那样)。
SELECT @number tested_number, 7 - LENGTH(nums.num) common_digits, bids.*
FROM bids
JOIN (SELECT 1 num UNION
SELECT 10 UNION
SELECT 100 UNION
SELECT 1000 UNION
SELECT 10000 UNION
SELECT 100000) nums
WHERE @number DIV nums.num = bids.ticketNumber DIV nums.num
ORDER BY nums.num LIMIT 1;
我有一个 table 的 6 位数字,范围为 0-9,我会将其与 6 个类别中的数字进行匹配
- 第一个数字匹配
- 前两个数字匹配
- 前三个数字匹配
- 前四位数字匹配
- 前五位数字匹配
- 所有号码都匹配
但只应选择最高类别。一个例子
人数:123456
- 如果号码是 [123]756 那么这将属于前三号码匹配类别
- 在号码 023456 上,这将不匹配
我为它创建了一个 fiddle https://www.db-fiddle.com/f/TZCrFPnJpkw4fyxA5Q6mR/1
什么是有效的方法?蛮力解决方案将是一个双循环,我想从 6 场比赛开始,5 场比赛,...
你可以这样做:
select *
from (
select 6 as score, b.* from bids b where ticketNumber like '123456%'
union all select 5, b.* from bids b where ticketNumber like '12345%'
union all select 4, b.* from bids b where ticketNumber like '1234%'
union all select 3, b.* from bids b where ticketNumber like '123%'
union all select 2, b.* from bids b where ticketNumber like '12%'
union all select 1, b.* from bids b where ticketNumber like '1%'
) x
order by score desc
limit 1
结果:
score id roundId address ticketNumber
------ --- -------- -------- ------------
6 1 1 12345 123456
参见 DB Fiddle 中的示例。
或者,您可以使用递归 CTE,但这在 MySQL 5.7 中不可用(正如您的 fiddle 暗示的那样)。
SELECT @number tested_number, 7 - LENGTH(nums.num) common_digits, bids.*
FROM bids
JOIN (SELECT 1 num UNION
SELECT 10 UNION
SELECT 100 UNION
SELECT 1000 UNION
SELECT 10000 UNION
SELECT 100000) nums
WHERE @number DIV nums.num = bids.ticketNumber DIV nums.num
ORDER BY nums.num LIMIT 1;