2015-04-29 2 views
3

У меня есть таблица вроде этого:MySQL несколько строк в строке встречаемости

----------- 
ID | Value 
----------- 
1 | AAAA 
2 | ABCD 
3 | AADC 
4 | ABBD 

Я пытаюсь выяснить, как вернуть количество раз строка происходит в каждом из значения.

Так что, если я хочу, чтобы кол-во времени «A» и «B'appears, оператор SQL возвратит так:

------------------- 
    ID | Value | Count 
    ------------------- 
    1 | AAAA | 0 
    2 | ABCD | 1 
    3 | AADC | 0 
    4 | ABBD | 2 
    5 | ABBB | 3 
    6 | AABB | 3 
    7 | AAAB | 3 
    8 | AABC | 2 
    9 | DBCA | 1 
    10 | CBAA | 2 
    11 | BDAB | 2 

Пример: Значение„ACBB“и символы Я хочу для поиска «A» и «B». И результат равен 2. Сначала мы ищем «A» и «B». Когда мы заменим первые «A» и «B», значение будет «CB» («C» и «B»), а счетчик будет равен 1. Если есть еще один «A» или «B», он будет счет. Таким образом, счетчик для примера равен 2, потому что есть один «B». Если есть 2 'B', результат равен 3.

Есть ли способ сделать это? Я не хочу использовать PHP, VB, и т.д. Просто MySQL

+1

Сначала значение должно соответствовать «A» и «B». И если есть другое значение «A» или «B», то оно будет считаться. Таким образом, шаг (A и B), (A или B), (A или B) = 3 – Slocky

+0

Возможный дубликат [Подсчитать количество вхождений строки в поле VARCHAR?] (Http://stackoverflow.com/questions/12344795/count-the-number-of-entries-of-a-string-in-a-varchar-field) –

+0

@ Leandro. Это не дубликат. Проверьте количество 6-й строки 'AABB = 3'. , Это не просто подсчет появления конкретного персонажа. Здесь задействована хорошая логика. +1 для хорошего вопроса –

ответ

0

Я попробовал это в Oracle, я надеюсь, что он работает в MySQL тоже:

select value, 
    case when value not like '%A%' or value not like '%B%' THEN 0 
    else (LENGTH(value) - LENGTH(REPLACE(value, 'A', '')) + LENGTH(value) - LENGTH(REPLACE(value, 'B', '')) - 1) 
    end case from test; 

Конечно, если ваша таблица имеет другое имя, вы необходимо изменить его в своем запросе.

+0

A и B, которые я хочу найти, это не строка («AB»), а 2 символа «A» и «B». И в соответствии с вашим ответом, когда значение AAAA, счетчик равен 3. Первое правило состоит в том, что значение должно содержать 2 символа («A» и «B»), которые я хочу искать, где бы они ни находились. Если он не содержит один из символов, который я хочу найти, то счетчик равен нулю – Slocky

+0

Также нам нужно разделить результирующее число на 'длина иглы ', так как оно не работает правильно с длиной иглы длиной более 1 символа –

+0

@Slocky: Извините, в этом случае я неправильно понял ваш вопрос. Другая часть: AAAA возвращает 0 в Oracle, это должно быть то же самое в MySQL. – Igorovics

0
SELECT ID, Value,  
    CASE 
    WHEN ROUND ((LENGTH(Value) - LENGTH(REPLACE (Value, "AB", "")))/LENGTH("AB")) = 0 THEN 0 
    WHEN ROUND ((LENGTH(Value) - LENGTH(REPLACE (Value, "AB", "")))/LENGTH("AB")) = 1 THEN 
    (ROUND ((LENGTH(Value) - LENGTH(REPLACE (Value, "A", "")))/LENGTH("A")) + 
    (ROUND ((LENGTH(Value) - LENGTH(REPLACE (Value, "B", "")))/LENGTH("B")) - 1 
END 
AS Count  
FROM tablename; 
+0

Каждая позиция символа в строке значений может быть случайной («DACB», «BCDA» и т. Д.). Это не всегда «AB» .. – Slocky