2015-07-03 22 views
5

Tôi có một hộp tìm kiếm mà tôi muốn tìm kiếm 6 cột trong cơ sở dữ liệu trường học của tôi khi một đầu vào được thực hiện. Cho đến nay, hộp tìm kiếm chỉ tìm kiếm trường tên và trả về kết quả khớp chính xác hoặc một phần.tìm kiếm nhiều cột với một hoặc nhiều từ khóa bằng cách sử dụng sql

Tôi muốn tìm kiếm thành phố cụ thể và có tất cả kết quả hiển thị từ tên VÀ cột thành phố (thay vì chỉ cột tên) v.v.

Giả sử tôi muốn tìm kiếm bằng mã zip, tôi muốn danh sách là tất cả các trường trong mã zip đó. Và cuối cùng nếu tôi nhập 2 từ (ví dụ: penn Philadelphia), tôi muốn tất cả các trường penn chỉ hiển thị trong cột tên VÀ cột thành phố. (không chỉ tất cả các penns trong tên hoặc mỗi trường ở Philadelphia) và như vậy. Đây có thể là một câu hỏi cơ bản về vấn đề này nhưng tôi đã tìm kiếm những ngày không thành công. Có thể sử dụng tốt hơn các ký tự đại diện và các mệnh đề "AND" "HOẶC" sẽ có lợi cho tôi.

Ai đó có thể giúp tôi cấu trúc truy vấn sql để thực hiện việc này không?

đây là những gì tôi có cho đến nay:

SELECT * FROM schools 
WHERE (name='%name%' OR address='%name%' OR city='%name%'OR zip='%name%') 
+0

bạn có thể sử dụng nhiều phương pháp: ví dụ để có "penn" và "philadelphia" bạn có thể làm: 'SELECT * FROM trường WHERE name = 'penn' AND city = 'philadelphia' ; 'bạn có thể kết hợp một vài điều kiện với nhau. Một cách tiếp cận khác: 'SELECT * FROM school s1, trường s2 JOIN ON s1.name = s2.name WHERE s1.name = 'penn' AND s1.city = 'philadelphia';' ở đây bạn cũng có thể sử dụng nhiều phép nối không đi hoang dã với nó nhưng có một chỉ số tốt giúp sau này mạnh mẽ – Hamed

+0

Ngoài ra còn có một cách tiếp cận mà bạn có thể sử dụng một vài SELECT lồng nhau (không được khuyến khích), như bạn làm: 'SELECT * FROM trường WHERE (SELECT * FROM trường WHERE name = ' penn ') AS s1 VÀ thành phố =' philadelphia '; '. Đừng đi quá sâu về điều này vì nó sẽ trở nên khó chịu. Chọn những gì phù hợp với bạn tốt nhất – Hamed

+0

@RyanVincent tốt nó không thực sự là một câu trả lời thích hợp giống như một vài lời khuyên – Hamed

Trả lời

4

Có vài cách để làm rằng- Chiến lược rất cơ bản là để phù hợp với đầu vào với các cột bảng của mình bằng cách truy vấn giống như bạn đề cập đến -

1. SELECT * FROM table WHERE (name='%name%' or zip='%name%' or city='%name%'); 

2. SELECT * FROM table WHERE LOCATE(name, GROUP_CONCAT(name,city,zip)) > 0; 

3. 
SELECT * FROM table WHERE name like '%name%' 
      UNION 
SELECT * FROM table WHERE name like '%name%' 
      UNION 
SELECT * FROM table WHERE name like '%name%'; 

nhưng giả sử trường hợp hộp nhập có chuỗi "varun bharti" nhưng tên thực trong cơ sở dữ liệu là "varun bal bharti" Vì vậy, khi bạn tìm kiếm, bạn sẽ bỏ lỡ bản ghi. cho trường hợp đó, bạn nên chia chuỗi theo khoảng trắng thành phần tử mảng và sử dụng các truy vấn này cho các phần tử hoặc bạn có thể thay thế khoảng trống trong cột tên và khớp.

set @var=REPLACE ('varun bharti', ' ', '%');  
SELECT * FROM table WHERE name like concat('%',@var,'%') or 
     zip like concat('%',@var,'%') or 
     city like concat('%',@var,'%'); 

Bạn cũng có thể sử dụng biểu thức regualar cho điều đó. Đối với chuỗi ví dụ đầu vào the day boss get

Hitesh> select * from test; 
+--------------------+ 
| name    | 
+--------------------+ 
| i am the boss  | 
| You will get soon | 
| Happy birthday bro | 
| the beautiful girl | 
| oyee its sunday | 
+--------------------+ 
5 rows in set (0.00 sec) 

Hitesh> set @var=CONCAT('.*',REPLACE('the day boss get',' ','.*|.*'),'.*'); 
Query OK, 0 rows affected (0.00 sec) 

Hitesh> select @var; 
+----------------------------------+ 
| @var        | 
+----------------------------------+ 
| .*the.*|.*day.*|.*boss.*|.*get.* | 
+----------------------------------+ 
1 row in set (0.00 sec) 

Hitesh> select * from test where name REGEXP @var; 
+--------------------+ 
| name    | 
+--------------------+ 
| i am the boss  | 
| You will get soon | 
| Happy birthday bro | 
| the beautiful girl | 
| oyee its sunday | 
+--------------------+ 
5 rows in set (0.00 sec) 
Các vấn đề liên quan