2014-09-09 2 views
2

My case is below.Mysql very special Нравится мне

У меня есть записи в таблице mysql в столбце «productname».

Adults-Work-Blue-Green-Pink-Ghagra-Choli-Dupatta 
Afro-Party-Retro-Wigs-Hair-Black-Curly-Gabbar 

Теперь я хочу, чтобы найти запись, которая начинается с А, а затем после того, как первый дефис W.

Если я пишу запрос, как показано ниже,

select DISTINCT Item_Code, Item_Name 
from tbl_stock_detail 
where Item_Name like 'A%-W%' 

Он показывает мне обе записи. Я хочу видеть только первую запись здесь, как после A, W - первое письмо после Hyphen. Аналогично Если я делаю это как «A% -W% -B%», я хочу, чтобы он показывал только первую запись, как после «A», «W» - первая буква после первого дефиса, а «B» - первая буква после второй дефис. Просто помните, что есть 1000 записей с множеством имен, поэтому мы не можем проверить длину строки.

Можно ли написать такой запрос в mysql, который также проверяет последовательность?

Извините, что я плохо в Regex. Это может быть возможно с регулярным выражением.

Просьба сообщить.

Edited Вопрос ниже:

У меня есть запись, как эта «длинная юбка красных блесток Tīkli танец» Теперь клиент говорит, что он хочет, чтобы искать на основе этих 3-х символов только R: Красных T: Tīkli S: Юбка

Также вторая вещь plz. Если у юбки и красного есть 2 пробела вместо 1, наше старое регулярное выражение не работает. Но он должен работать, поскольку они ошибочно добавили несколько пробелов между двумя словами. вы можете помочь мне выполнить эти 2 требования?

Подробнее Редактирование:

Это работает статичное, но это дает мне некоторые проблемы последовательности бежать в PHP. Ниже приведен мой php-код,

<?php 
$var = 'SRT'; 
for($i=0;$i<strlen($var);$i++) 
{ 
    $term = '^'.$var[$i].'|[- ]'.$var[$i]; 
    if($i == 0) 
     $subquery0 .= " where Item_Name REGEXP '".$term."'";  
    else 
     $subquery0 .= " or Item_Name REGEXP '".$term."'"; 
} 
?> 

Когда я повторяю $ term, он показывает только «^ S». Но если я удаляю | символ, то он показывает полную строку. Может быть, символ трубы нуждается в escape-последовательности. Я попробовал его как «// |» но он не работает. Любая идея об этом или мне нужно открыть новый вопрос, так как это вопрос PHP?

+3

'Item_Name REGEXP 'A [^ -] + - W. *'' Должен работать. – hjpotter92

+0

@ hjptter92: Я думаю, что в регулярном выражении должна быть ведущая каретка. ** ''^A'' **, чтобы соответствовать началу строки, поскольку спецификация «начинается с A», остальная часть регулярного выражения выглядит идеально. – spencer7593

+0

Спасибо, hjptter92 за помощь. – Vivek

ответ

2

Как предлагает hjpotter92 в своем комментарии, вы должны иметь возможность использовать регулярное выражение для поиска строк с указанными совпадениями.

Один префикс LIKE не может выполнить этот тип соответствия. (Он должен был знать максимальную длину каждого компонента («Взрослые», «Работа» и т. Д.) И целую громоздкую лодку предикатов LIKE и объединились для всех возможных возможных расстояний. не хотят туда ехать.)

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


Чтобы соответствовать первому символу является «A» (прописные или строчные буквы), затем следуют дефис, сразу после первого дефиса является «W», вы могли бы сделать что-то вроде этого:

WHERE Item_Name REGEXP '^A[^-]*-W' 

Аналогичным образом, начиная с а, за которым следует (какой-то момент позже) дефисом, сразу же после следующего дефис а «W», а затем (позже) по другим дефисом и «B»

WHERE Item_Name REGEXP '^A[^-]*-W[^-]*-B' 

Давайте распаковать, что в прошлом регулярного выражения немного, по частям:

^A

Первой каретка соответствует началу строки, а персонажу соответствует символу A (примечание: это нечувствительность к регистру при подключении к моим базам данных). Итак, это говорит, «начиная с A или a».

[^-]*

эта часть совпадает с любым количеством символов, которые не являются дефис.

-W

эта часть соответствует дефис сразу за которым следует W. (Из непосредственно предшествующей части, это было бы первым дефисом, которое происходит после того, как А, который был ранее согласованный.)

[^-]*

снова, любое количество символов (ноль или более), которые не являются дефиса

-B

соответствует дефис немедленно за ним B. Опять же, это будет первый дефис после W, который был подобран.

И остальная часть строки может быть чем угодно.

+0

Я не могу быть достаточно благодарен вам. Вы так хорошо объяснили. Большое спасибо .. Это сработало для меня :) – Vivek

+0

spencer7593 как мы можем использовать это, если я хочу, чтобы «-» или «пробел» разрешалось до каждой первой буквы. Я пробовал это, но не работал. '^ A [^ -] * - W [^ -] * - B' – Vivek

+0

@Vivek: это близко, но вам также необходимо разрешить совпадение с пробелом -или- дефис, предшествующим ** 'W '**. Просто замените этот дефис непосредственно перед ** 'W' ** на **' [-] '**, что позволит совместить либо дефис, либо пробел. Сделайте то же самое перед ** 'B' ** Что-то вроде этого должно работать: **'^A [^ -] * [-] W [^ -] * [-] B' ** – spencer7593