2013-02-04 13 views
8

मैं दो तालिकाओं है वापस नहीं:mysql मैच के खिलाफ केस संवेदी परिणाम

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 ; 

बाल्टी सिर्फ एक धारक है, जबकि test1 सभी चीजें हैं जो एक बाल्टी में जाना हैं। उदाहरण के लिए:

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'); 

अब, निम्न क्वेरी मैं सभी बाल्टी जिसका नाम, वर्णन या कीवर्ड खोज शब्द "परिवार" होती है या जिसका घटकों शब्द "परिवार")

शामिल देखने के लिए चाहते हैं का उपयोग कर अब तक, मेरे पास यह प्रश्न है और यह मिश्रित केस परिणामों को वापस नहीं कर रहा है क्योंकि "परिवार" में "परिवार" नहीं मिला है।

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) 

मैं भी जोड़ना चाहिए कि सभी टेक्स्ट फ़ील्ड utf8_general_ci का मिलान के रूप में पूरे तालिका जो MyISAM है करता है।

+0

आपके उदाहरण में बाल्टी विवरण और परीक्षण विवरण दोनों में सभी निचले मामले में "परिवार" है। क्या आप अपनी समस्या का प्रदर्शन करने के लिए एक बेहतर उदाहरण बना सकते हैं? – scwagner

+1

एफवाईआई, test1 के लिए आपके सम्मिलन कथन में फ़ील्ड नाम गलत हैं ('test1_name',' test1_desc' होना चाहिए)। इसके अलावा आपके चयन में bucket.isvisible> 0 है, जो उदाहरण तालिका में शामिल नहीं है। एक बार जब मैंने उन दो चीजों को ठीक कर दिया, तो क्वेरी ने पंक्तियों को वापस कर दिया, इसलिए दुर्भाग्यवश मुझे आपकी वास्तविक समस्या का कारण पता नहीं है। (बेशक पूरी पूंजी की बात एक लाल हेरिंग है, और वास्तविक समस्या यह है कि सिम्पसंस पंक्ति पर bucket.isvisible पैरामीटर!) –

+0

इसके अलावा आप इस तरह की क्वेरी को सरल बना सकते हैं: चुनें * बाल्टी से सही परीक्षण 1 परीक्षा 1 पर .bucket_id = bucket.id कहां मैच (bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name, test1.test1_desc, test1.test1_name) के खिलाफ (बूलियन मोड में 'परिवार') –

उत्तर

1

उत्तर स्पष्ट रूप से क्लॉज के खिलाफ दो मैच के आसपास कुछ अभिभावकों को जोड़ रहा है।

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

ओएमजी लौटते हैं! हां, यह ऑपरेटर प्राथमिकता (http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html) के कारण है ... माता-पिता के बिना, आपकी हालत 'WHERE (isvisible> 0 के बराबर थी और मैच (...)) या (MATCH (...)) ' – RandomSeed

2

मुझे लगता है कि आपकी तालिका utf8_general_ci को संयोजन के रूप में उपयोग नहीं करती है, लेकिन utf8_bin

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

आप शायद करने के लिए स्पष्ट रूप से अपने टेबल 'मिलान स्थापित करना चाहिए:

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

ऊपर कुछ भी बदलता है, तो मुझे लगता है कि होगा मैं इस प्रकार टेबल संशोधित करने के बाद व्यवहार आपके द्वारा बताई गई पुन: पेश करने में सक्षम था आपका सर्वर या सत्र वास्तव में डिफ़ॉल्ट रूप से एक और संयोजन का उपयोग करने के लिए सेट होता है (क्योंकि आपके टेबल परिभाषा में संयोजन निर्दिष्ट नहीं है)। इसके साथ जांच की जा सकती है:

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

phpMyAdmin का उपयोग करके सभी फ़ील्ड और टेबल collfation utf8_general_ci के रूप में दिखाते हैं। यदि मैं टेबल निर्यात करता हूं तो COLLATE को utf8_general_ci पर सेट किया जाता है। – ppetree

+0

इसके अलावा SHOW कथन दोनों utf8_unicode_ci – ppetree

संबंधित मुद्दे