2013-02-04 19 views
8

Tôi có hai bảng:mysql trận đấu với không trở về trường hợp kết quả không nhạy cảm

CREATE TABLE IF NOT EXISTS `test1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bucket_id` int(10) unsigned NOT NULL COMMENT 'folder this component belongs to', 
    `test1_name` varchar(81) NOT NULL COMMENT 'Name of this component', 
    `test1_desc` varchar(1024) NOT NULL COMMENT 'Component Description', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `test1_search` (`test1_name`,`test1_desc`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `bucket` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bkt_name` varchar(81) NOT NULL COMMENT 'The name of this bucket', 
    `bkt_desc` varchar(1024) NOT NULL COMMENT 'A description of this bucket', 
    `bkt_keywords` varchar(512) DEFAULT NULL COMMENT 'keywords for searches', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `fldr_search` (`bkt_desc`,`bkt_keywords`,`bkt_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; 

Bucket chỉ là một người giữ khi test1 chứa tất cả những điều đó sẽ đi vào một cái xô. Ví dụ:

INSERT INTO `bucket` (`id`, `bkt_name`, `bkt_desc`, `bkt_keywords`) VALUES 
(1, 'Simpsons', 'The Simpsons Cartoon Family was first successful adult cartoon series', 'Homer, Marge, Lisa and Bart'), 
(2, 'Griffins', 'The family from the popular family guy series', 'Peter, Lois, Meg, Chris, Stewie, Brian'); 

INSERT INTO `test1` (`id`, `bucket_id`, `bkt_name`, `bkt_desc`) VALUES 
(1, 1, 'Homer Simpson', 'Homer the figurative head of the Simpsons Family and is the husband of Marge'), 
(2, 2, 'Peter Griffin', 'Peter the figurative head of the Griffin family on the hit TV seriers The family Guy'); 

Bây giờ, bằng cách sử dụng truy vấn sau đây tôi muốn tìm kiếm tất cả xô tên, mô tả hoặc từ khóa chứa các cụm từ tìm kiếm "gia đình" hoặc có thành phần chứa các từ "gia đình")

Cho đến nay, những gì tôi có là truy vấn này và nó không trả lại kết quả trường hợp hỗn hợp như trong "Gia đình" không được tìm thấy trong khi "gia đình" được.

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE 
    bucket.isvisible > 0 AND 
    MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE) 

Tôi cũng nên thêm rằng tất cả các trường văn bản đều có collation của utf8_general_ci cũng như toàn bộ bảng là MyISAM.

+0

Ví dụ của bạn được cung cấp có "họ" trong mọi trường hợp thấp hơn trong cả mô tả thùng và mô tả thử nghiệm. Bạn có thể làm một ví dụ tốt hơn để chứng minh vấn đề của bạn? – scwagner

+1

FYI, tên trường trong câu lệnh chèn của bạn cho test1 là không chính xác (phải là 'test1_name',' test1_desc'). Ngoài ra, SELECT của bạn có bucket.isvisible> 0, không được bao gồm trong bảng ví dụ. Khi tôi đã sửa hai thứ đó, truy vấn trả về cả hai hàng, vì vậy rất tiếc tôi không biết nguyên nhân của vấn đề thực tế của bạn. (Trừ khi tất nhiên vốn toàn bộ vốn là một cá trích đỏ, và vấn đề thực sự là tham số bucket.isvisible trên hàng simpsons!) –

+0

Ngoài ra bạn có thể đơn giản hóa các truy vấn như vậy: SELECT * FROM bucket RIGHT JOIN test1 ON test1 .bucket_id = bucket.id WHERE MATCH (bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name, test1.test1_desc, test1.test1_name) AGAINST ('family' IN BOOLEAN MODE) –

Trả lời

1

Câu trả lời rõ ràng là thêm một số parens xung quanh hai kết hợp với mệnh đề.

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE bucket.isvisible > 0 AND 
(MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE)) 
+0

OMG! Có, điều này là do quyền ưu tiên của toán tử (http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html) ... Nếu không có parens, điều kiện của bạn tương đương với 'WHERE (isvisible> 0 VÀ MATCH (...)) HOẶC (MATCH (...)) ' – RandomSeed

2

Tôi nghĩ rằng các bảng của bạn không sử dụng utf8_general_ci làm đối chiếu, nhưng utf8_bin. Tôi đã có thể để tạo lại hành vi bạn mô tả sau khi sửa đổi các bảng như sau:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 

Bạn có lẽ nên đặt đối chiếu bảng của bạn explicitely tới:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Nếu ở trên thay đổi bất cứ điều gì, tôi sẽ đoán máy chủ hoặc phiên của bạn thực sự được đặt để sử dụng một đối chiếu khác theo mặc định (vì collation không được chỉ định trong định nghĩa bảng của bạn). Điều này có thể được kiểm tra với:

SHOW GLOBAL VARIABLES LIKE 'collation_server'; 
SHOW SESSION VARIABLES LIKE 'collation_server'; 
+0

Sử dụng phpMyAdmin tất cả các trường VÀ các bảng hiển thị collation là utf8_general_ci. Nếu tôi xuất các bảng, COLLATE được đặt thành utf8_general_ci. – ppetree

+0

Đồng thời báo cáo SHOW đều trả về utf8_unicode_ci – ppetree