2012-08-13 80 views
19

Tôi đang cố gắng tìm kiếm toàn bộ bảng trong mySQL cho một chuỗi.Tìm kiếm toàn bộ bảng trong mySQL bằng một chuỗi

Tôi muốn tìm kiếm tất cả các trường và tất cả các entrees của bảng, trả về từng mục nhập đầy đủ có chứa văn bản được chỉ định.

Tôi không thể tìm ra cách tìm kiếm nhiều trường một cách dễ dàng; dưới đây là chi tiết:

Bảng này là "khách hàng". Nó có khoảng 30 trường và 800 mục, quá nhiều để hiển thị cùng một lúc trong một trình duyệt. Tôi muốn tìm kiếm tên (tức là "Mary"), nhưng có thể là tên trong số shipping_name field hoặc billing_name field hoặc trường email, v.v.

Tôi muốn tìm kiếm tất cả các trường cho bất kỳ mục nhập nào chứa chuỗi "Mary". Đây là những gì tôi nghĩ nên làm việc nhưng không:

SELECT * FROM `clients` IN 'Mary' 

Trả lời

18

Hãy thử một cái gì đó như thế này:

Select * from clients where Concat(field1, '', field2, '', fieldn) like "%Mary%" 

Bạn có thể muốn xem tài liệu SQL để biết thêm thông tin về điều hành chuỗi và biểu thức thông thường.

Edit: có thể có một số vấn đề với các lĩnh vực NULL, vì vậy chỉ cần trong trường hợp bạn có thể muốn sử dụng IFNULL(field_i, '') thay vì chỉ field_i

Trường hợp nhạy: bạn có thể sử dụng trường hợp đối chiếu nhạy cảm hoặc một cái gì đó giống như

... Where lower(concat(...)) like lower("%Mary%") 

Chỉ cần tìm kiếm tất cả các trường: Tôi tin rằng không có cách nào để thực hiện truy vấn SQL sẽ tìm kiếm trong tất cả các trường mà không khai báo rõ ràng trường để tìm kiếm. Lý do là có cơ sở dữ liệu ational và các quy tắc nghiêm ngặt để thao tác dữ liệu quan hệ (một cái gì đó giống như đại số quan hệ hoặc đại số codd; đây là những gì SQL là từ), và lý thuyết không cho phép những thứ như "chỉ cần tìm kiếm tất cả các lĩnh vực". Tất nhiên hành vi thực tế phụ thuộc vào việc thực hiện cụ thể của nhà cung cấp. Nhưng trong trường hợp thông thường, điều đó là không thể. Để đảm bảo, hãy kiểm tra cú pháp số select của người vận hành (where phần, để được tư vấn).

+2

Tôi thực sự đang tìm cách không phải nhập mọi trường của bảng vào. Tôi muốn tìm kiếm tất cả các trường. Tôi cho rằng một điều đơn giản như vậy là có thể. Ngoài ra tôi nhận ra rằng khi tôi gõ chữ thường "mary" nó không tìm thấy "Mary". làm thế nào nó có thể làm cho nó không phải là trường hợp nhạy cảm, và tìm kiếm tất cả các lĩnh vực? – VoltzRoad

+0

chúng ta có thể concat (*)? – Waqas

+2

Trích dẫn đơn trống '' là gì? Cảm ơn – KDawg

12

Xác định tất cả các lĩnh vực mà có thể liên quan đến tìm kiếm của bạn và sau đó sử dụng một truy vấn như:

SELECT * FROM clients 
WHERE field1 LIKE '%Mary%' 
    OR field2 LIKE '%Mary%' 
    OR field3 LIKE '%Mary%' 
    OR field4 LIKE '%Mary%' 
    .... 
    (do that for each field you want to check) 

Sử dụng LIKE '%Mary%' thay vì = 'Mary' sẽ tìm kiếm các lĩnh vực có chứa someCaracters + 'Mary' + someCaracters.

+0

vấn đề ở đây là tôi phải nhập từ "Mary" trong 45 lần cho một truy vấn tìm kiếm. Sau đó, tôi tắt để đối phó với khách hàng tiếp theo trong danh sách của tôi .... thường là 10-20 mỗi ngày! Tất cả im cố gắng làm là kéo lên một hồ sơ khách hàng. không thể mất hơn 15 giây – VoltzRoad

+4

Viết kịch bản và xác định @VARIABLE nơi bạn đặt tên đó, bạn sẽ viết nó một lần sau đó chỉ phải sửa đổi biến đó .. –

+0

Nếu bạn đang đặt cụm từ tìm kiếm trực tiếp vào SQL của mình thì bạn đang làm sai. Làm như Francis P nói. – nickdnk

3

Giải pháp dựa trên PHP cho toàn bộ bảng tìm kiếm! Chuỗi tìm kiếm là chuỗi $. Đây là chung chung và sẽ làm việc với tất cả các bảng với bất kỳ số lượng các lĩnh vực

$sql="SELECT * from client_wireless"; 
$sql_query=mysql_query($sql); 
$logicStr="WHERE "; 
$count=mysql_num_fields($sql_query); 
for($i=0 ; $i < mysql_num_fields($sql_query) ; $i++){ 
if($i == ($count-1)) 
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' "; 
else 
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' OR "; 
} 
// start the search in all the fields and when a match is found, go on printing it . 
$sql="SELECT * from client_wireless ".$logicStr; 
//echo $sql; 
$query=mysql_query($sql); 
+1

đây là câu trả lời hay nhất trong tất cả các câu trả lời ở trên –

0

Nếu bạn đang sử dụng Sublime, bạn có thể dễ dàng tạo ra hàng trăm hoặc hàng ngàn dòng sử dụng Text Pastry kết hợp với lựa chọn dòng nhiều và Emmet.

Vì vậy, trong trường hợp của tôi, tôi đặt loại tài liệu thành html, sau đó nhập div*249, tab nhấn và Emmet tạo ra 249 div trống. Sau đó, sử dụng nhiều lựa chọn, tôi đã nhập col_id_ vào mỗi trang và kích hoạt Text Pastry để chèn số id gia tăng.Sau đó, với nhiều lựa chọn một lần nữa, bạn có thể xóa đánh dấu div và thay thế bằng cú pháp MySQL.

3

Ngoài pattern matching bằng từ khóa 'thích'. Bạn cũng có thể thực hiện tìm kiếm bằng cách sử dụng tính năng fulltext như sau;

SELECT * FROM clients WHERE MATCH (shipping_name, billing_name, email) AGAINST ('mary') 
2

Nếu bạn chỉ là tìm kiếm một số văn bản và không cần một tập kết quả cho các mục đích lập trình, bạn có thể install HeidiSQL miễn phí (Tôi đang sử dụng v9.2.0.4947).

Nhấp chuột phải vào bất kỳ cơ sở dữ liệu hoặc bảng nào và chọn "Tìm văn bản trên máy chủ".

Tất cả các kết quả phù hợp được hiển thị trong một tab riêng biệt cho mỗi bảng - rất hay.

Đáng sợ hữu ích và tiết kiệm thời gian cho tôi. Quên rối tung với các truy vấn dài !!

+0

Wow điều này thật tuyệt. Tôi đã sử dụng Heidi và không biết về tính năng này. – ds00424

0

cho yêu cầu cụ thể sau đây sẽ làm việc cho tìm kiếm:

select * form table_name where (column_name1='%var1%' or column_name2='var2' or column_name='%var3%') and column_name='var'; 

nếu bạn muốn truy vấn tìm kiếm dữ liệu từ cơ sở dữ liệu này sẽ làm việc một cách hoàn hảo.

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