2009-01-24 39 views
6

Tôi hiện đã sau hai bảng:Tìm kiếm hai bảng

CREATE TABLE files_list 
(
    'listid' INT, 
    'name' VARCHAR(25), 
    'synonym' VARCHAR(25), 
    'description' VARCHAR(25) 
); 

CREATE TABLE files_tags 
(
    'tag_name' VARCHAR(25), 
    'listid' INT 
); 

Nếu ai đó sử dụng từ khóa "bóng rồng", vào lúc này, tôi sử dụng sau đây truy vấn để tìm kiếm my_list cho trận đấu càng tốt:

SELECT * 
FROM files_list 
WHERE name LIKE '%dragon%' 
OR synonym LIKE '%dragon%' 
OR description LIKE '%dragon%' 
OR name LIKE '%ball%' 
OR synonym LIKE '%ball%' 
OR description LIKE '%ball%' 

Tôi không chắc chắn cách tìm kiếm cả hai bảng bằng một truy vấn. Tôi muốn hiển thị dữ liệu người dùng sau trong kết quả tìm kiếm: tên, từ đồng nghĩa, mô tả và tất cả các thẻ.

Câu hỏi của tôi 1. Có cách nào để thực hiện truy vấn mysql hiện tại ngắn hơn không? 2. Làm cách nào tôi có thể kết hợp nó với bảng files_tags, - để hiển thị các hàng từ files_list có khớp trong files_tags, nhưng không phải trong files_list? - để hiển thị các hàng từ files_list có khớp trong files_list, but may not in tệp_tags`?

Bạn có thể xem kết quả hiển thị hiện tại http://hsbsitez.com/

+0

http://stackoverflow.com/questions/394041/mysql-how-to-search-nhiều-bảng-cho-một-chuỗi-hiện-trong-bất kỳ-cột Xem câu hỏi này câu trả lời của bạn là có :) – fmsf

+0

Có thể trùng lặp của [MySQL: Cách tìm kiếm nhiều bảng cho một chuỗi hiện có trong bất kỳ cột nào] (http://stackoverflow.com/questions/394041/mysql-how-to-search-multiple-tables-for-a-string-existing-in-any-column) – KindaTechy

Trả lời

0

Hãy cẩn thận khi sử dụng kết hợp để thực sự có được những cột mà bạn muốn cho mỗi truy vấn unioned. Và trường hợp này, một subquery dường như có ý nghĩa hơn:

SELECT name, synonym, description FROM files_list WHERE 
     name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' 
     OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%' 
     OR listid IN (SELECT listid FROM files_tags WHERE tag_name='dragon' OR tag_name='ball'); 

Một số câu hỏi thêm: Khi bạn nói rằng bạn muốn hiển thị cho người sử dụng "tất cả các thẻ", bạn có nghĩa tất cả các thẻ đang tồn tại trong một listid được? Hay chỉ những thứ phù hợp? Và nếu mô tả như "% dragon%", thì rồng là một trong các thẻ bạn muốn trả lại ngay cả khi nó không có trong tệp_tags?

1

Sẽ hợp lý khi tham gia các bảng.

SELECT name, synonym, description, tag_name FROM `files_list` WHERE (name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%') 
OUTER JOIN files_tags on files_tags.listid = files_list.listid 

OUTER JOIN sẽ đảm bảo tất cả các thẻ được lựa chọn, điều này sẽ tạo ra các hàng trùng lặp khi nhiều thẻ mỗi id có sẵn, với sự khác biệt duy nhất là thẻ

+0

Chỉ hoạt động nếu chúng là các phím quan hệ – KindaTechy

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