在mysql中实现增量搜索

时间:2015-09-04 05:32:24

标签: mysql ruby-on-rails ruby

我想在MySQL中实现增量搜索。该搜索将从左到右。

我在MySQL中有以下数据。

测试数据库:http://sqlfiddle.com/#!9/d23e0/1

情景:

+-------+
| code  |
+-------+
| 0412  |
| 05412 |
| 1412  |
| 20412 |
| 28412 |
| 30412 |
| 34120 |
| 34121 |
| 34122 |
| 37412 |
| 40412 |
| 412   |
| 41412 |
| 4412  |
| 47412 |
| 52412 |

我想要检索其中包含'4'的所有代码。代码应按以下顺序返回。首先是所有代码在第一个位置都有'4',然后在第二个位置有'4',依此类推。 输出应为:

+-------+
| code  |
+-------+
| 40412 |
| 412   |
| 41412 |
| 4412  |
| 47412 |
| 0412  |
| 1412  |
| 34120 |
| 34121 |
| 34122 |
| 05412 |
| 20412 |
| 28412 |
| 30412 |
| 37412 |
| 52412 |

编辑:我修改了要求。

2 个答案:

答案 0 :(得分:1)

Mysql有SUBSTRING_INDEX,它根据给定的分隔符返回给定列的子字符串。 您可以使用此操作执行订单操作。 对于您列出的两种方案,您可以使用以下查询

KalturaClient

答案 1 :(得分:1)

注意:这是原始问题的解决方案已被更改(因为没有人说得对...包括我自己)。

原始要求:仅返回那些包含' 4'如果没有这样的代码,则在第一个位置返回具有'在第二位等等..

SQL小提琴:http://sqlfiddle.com/#!9/d23e0/24

SELECT t1.code, t1.digitGroup, t1.thePosition
FROM
(
    SELECT code,
        CASE WHEN CHAR_LENGTH(code) >= 1 AND SUBSTRING(code, 1, 1) = '4' THEN 1
         WHEN CHAR_LENGTH(code) >= 2 AND SUBSTRING(code, 2, 1) = '4' THEN 2
         WHEN CHAR_LENGTH(code) >= 3 AND SUBSTRING(code, 2, 1) = '4' THEN 3
         WHEN CHAR_LENGTH(code) >= 4 AND SUBSTRING(code, 2, 1) = '4' THEN 4
         WHEN CHAR_LENGTH(code) >= 5 AND SUBSTRING(code, 2, 1) = '4' THEN 5
    ELSE 0
    END AS digitGroup,
    POSITION('4' IN code) AS thePosition
    FROM icd9_codes
) t1
WHERE t1.digitGroup > 0 AND t1.digitGroup =
    (
        SELECT MIN(t2.theMin) FROM
            (
                SELECT CASE WHEN POSITION('4' IN code) = 0 THEN 5
                    ELSE POSITION('4' IN code)
                    END AS theMin
                FROM icd9_codes
            ) t2
    )
相关问题