2012-07-16 36 views
6

Tôi có bảng cơ sở dữ liệu với các từ trong từ điển.Tìm kiếm Cụm từ thông dụng Mysql không có ký tự lặp lại

Bây giờ tôi muốn chọn các từ cho một đảo chữ cái. Ví dụ nếu tôi cung cấp cho các chuỗi SEPIAN nó nên lấy giá trị như apes, pain, pains, pies, pines, sepia vv

Đối với điều này tôi đã sử dụng các truy vấn

SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$' 

Nhưng truy vấn này trả lời như anna, essen có các ký tự lặp lại không nằm trong chuỗi được cung cấp. Ví dụ. anna có hai số n nhưng chỉ có một n trong chuỗi tìm kiếm SEPIAN.

Làm cách nào để viết biểu thức chính quy của mình để đạt được điều này? Ngoài ra nếu có các ký tự lặp lại trong chuỗi tìm kiếm của tôi tại thời điểm đó, các ký tự lặp lại sẽ phản ánh trong kết quả.

Trả lời

5

Vì MySQL không hỗ trợ nhóm chụp lại tham chiếu, giải pháp điển hình của (\w).*\1 sẽ không hoạt động. Điều này có nghĩa là bất kỳ giải pháp nào được đưa ra sẽ cần phải liệt kê tất cả các cặp đôi có thể. Hơn nữa, như xa như tôi có thể nói trở lại tài liệu tham khảo là không hợp lệ trong look-aheads hoặc look-behinds, và look-aheads và look-behinds không được hỗ trợ trong MySQL.

Tuy nhiên, bạn có thể chia thành hai biểu thức, và sử dụng các truy vấn sau đây:

SELECT * FROM words 
WHERE word REGEXP '^[SEPIAN]{1,6}$' 
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N.*?N' 

Không rất đẹp, nhưng nó hoạt động và nó nên được khá hiệu quả là tốt.


Để hỗ trợ một giới hạn bộ ký tự lặp đi lặp lại, sử dụng mô hình sau đây cho biểu phụ của bạn:

A(.*?A){X,} 

đâu A là nhân vật của bạn và X là số lần nó được phép.

Vì vậy, nếu bạn đang thêm N khác để chuỗi của bạn SEPIANN (với tổng số 2 N s), truy vấn của bạn sẽ trở thành:

SELECT * FROM words 
WHERE word REGEXP '^[SEPIAN]{1,7}$' 
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N(.*?N){2}' 
+0

hey nó hoạt động thanks a lot – Nithin

2

Tôi đoán một cái gì đó như thế này sẽ giúp bạn. Bảng words:

| id | word  | alfagram | 
--------------------------------- 
| 1  | karabar | aaabkrr | 
| 2  | malabar | aaablmr | 
| 3  | trantantan| aaannnrttt| 

alfagram ở đây là chữ của một từ trong một thứ tự chữ cái.

mã PHP:

$searchString = 'abrakadabra'; 
$searchStringAlfa = array(); 
for($i=0,$c=strlen($searchString);$i<$c;$i++){ 
    if(isset($searchStringAlfa[$searchString[$i]])){ 
     $searchStringAlfa[$searchString[$i]]++; 
    }else{ 
     $searchStringAlfa[$searchString[$i]] = 1; 
    } 
} 
ksort($searchStringAlfa); 
$regexp = '^'; 
foreach($searchStringAlfa as $alfa=>$amount){ 
    $regexp .= '['.$alfa.']{0,'.$amount.'}'; 
} 
$regexp .= '$'; 

$searchString là chuỗi bạn muốn tìm kiếm với.Sau đó, điều duy nhất bạn cần làm là thực hiện truy vấn:

$result = mysql_query('SELECT * FROM words WHERE alfagram REGEXP "'.$regexp.'"'); 

Có thể một số kiểm tra bổ sung và optimisations cần

+0

Tôi thích video này. Nó thông minh. – dlras2

+0

suy nghĩ thông minh ý tưởng hay :-) – Nithin

Các vấn đề liên quan