2012-07-16 9 views
7

मैं वर्तमान में अपना स्वयं का सीएमएस कोडिंग कर रहा हूं और मैं search.php के बिंदु पर हूं। मुझे 4 टेबलों में खोज करने की ज़रूरत है जो अलग-अलग कॉलम नामों को केवल एक क्वेरी में सहेजते हैं क्योंकि मेरा सर्वर सबसे तेज़ नहीं है।MySQL - खोजें PHP स्क्रिप्ट

cmw_admin (उन तालिका)

+-----------------+------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+-----------------+------------+------+-----+---------+----------------+ 
| id    | int(11) | NO | PRI | NULL | auto_increment | 
| role   | int(11) | NO |  | 1  |    | 
| username  | text  | NO |  | NULL |    | 
| password  | text  | NO |  | NULL |    | 
| email   | text  | NO |  | NULL |    | 
| phone   | text  | NO |  | NULL |    | 
| location  | text  | NO |  | NULL |    | 
| full_name  | text  | NO |  | NULL |    | 
| bio    | text  | NO |  | NULL |    | 
| website   | text  | NO |  | NULL |    | 
| last_login  | datetime | NO |  | NULL |    | 
| registered_date | datetime | NO |  | NULL |    | 
| registered_ip | text  | NO |  | NULL |    | 
| credits   | tinyint(1) | NO |  | NULL |    | 
| online   | int(11) | NO |  | 0  |    | 
+-----------------+------------+------+-----+---------+----------------+ 

cmw_blog (लेख तालिका)

+------------+----------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+------------+----------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| title  | text  | NO |  | NULL |    | 
| content | text  | NO |  | NULL |    | 
| date  | datetime | NO |  | NULL |    | 
| author  | int(11) | NO |  | NULL |    | 
| categories | text  | NO |  | NULL |    | 
| media  | text  | NO |  | NULL |    | 
| thumb  | text  | NO |  | NULL |    | 
+------------+----------+------+-----+---------+----------------+ 

cmw_projects (पोर्टफोलियो)

+-------------+------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+------------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| owner_id | int(11) | NO |  | NULL |    | 
| title  | text  | NO |  | NULL |    | 
| content  | text  | NO |  | NULL |    | 
| date  | date  | NO |  | NULL |    | 
| link  | text  | NO |  | NULL |    | 
| img   | text  | NO |  | NULL |    | 
| type  | int(11) | NO |  | NULL |    | 
| start_date | date  | NO |  | NULL |    | 
| end_date | date  | NO |  | NULL |    | 
| done  | tinyint(1) | NO |  | 0  |    | 
| screenshots | text  | NO |  | NULL |    | 
+-------------+------------+------+-----+---------+----------------+ 
:

मेरी डीबी व्यवस्था नहीं है

cmw_services (सेवाओं तालिका)

+-------------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+---------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| cat_id  | int(11)  | NO |  | NULL |    | 
| name  | text   | NO |  | NULL |    | 
| description | text   | NO |  | NULL |    | 
| img   | text   | NO |  | NULL |    | 
| price  | decimal(11,2) | NO |  | NULL |    | 
+-------------+---------------+------+-----+---------+----------------+ 

मेरी खोज में, मैं हर name/title स्तंभों में और भी सभी description/content स्तंभों में स्ट्रिंग के लिए खोज करने की जरूरत है। स्पष्ट रूप से, मैं केवल एक प्रश्न में, उन सभी तालिकाओं को एक स्ट्रिंग के लिए खोजना चाहता हूं। क्या यह संभव है? मुझे पता है कि JOIN, LEFT JOIN, RIGHT JOIN और INNER JOIN का उपयोग करना आसान हो सकता है लेकिन मुझे नहीं पता कि उनका उपयोग कैसे किया जाए। Google उन चीज़ों पर बहुत स्पष्ट नहीं है!

+3

+1। – Lion

+0

एक जॉइन के साथ करना बहुत आसान है, लेकिन कोई भी मैच सभी 4 टेबलों से प्रत्येक कॉलम लौटाएगा। मुझे नहीं लगता कि यह इरादा व्यवहार है। इससे कोई फर्क नहीं पड़ता कि आपका सर्वर कितना धीमा है, आपको 4 प्रश्न करना चाहिए या अपने डेटाबेस को फिर से ढांचा बनाना चाहिए –

उत्तर

4

चार सीधे प्रश्नों की कुल लागत जॉइन की लागत से बहुत कम संभावना है और साथ ही उन रिकॉर्ड/फ़ील्ड की खोज भी कम है।

यदि कुछ भी है, तो FULLTEXT अनुक्रमणिका की संभावनाओं की जांच करें।

किसी भी मामले में, आप की तरह

SELECT "cmw_admin" as source, id FROM cmw_admin, NULL as date [...] WHERE bio LIKE '%search%' 
UNION 
SELECT "cmw_blog" as source, id FROM cmw_admin, date as date [...] WHERE 
    (title LIKE '%search%' OR content LIKE '%search%') 
UNION 
... 

जो आप पाया रिकॉर्ड की एक सूची दे देंगे कुछ के साथ ऐसा कर सकते हैं, एक साथ की जहां रिकॉर्ड ("cmw_admin", "cmw_blog से आया एक संकेत के साथ ", ...); जो आपको विभिन्न स्रोतों से रिकॉर्ड्स पेश करने का तरीका चुनने देगा।

क्वेरी हमेशा "स्रोत" के आधार पर मान्य मानों के साथ कुछ फ़ील्ड का एक ही सेट वापस कर देगी, कुछ नहीं। फिर अपने PHP स्क्रिप्ट में आप की तरह कुछ कर सकते हैं

$source = $record['source']; 
if (!isset($template[$source])) 
    $template[$source] = file_get_contents("templates/search/$source.html"); 

$html_view = preg_replace('#{{\s*([^}\s]*)\s*}}#e', 'isset(\$record["\1"])?\$vars["\1"]:""', $template[$source]); 

इस के [तिथि] प्रविष्टि के साथ "पॉप्युलेट" मैदान की तरह

<h2>{{ date }}</h2> 

एक HTML टुकड़ा युक्त एक HTML टेम्पलेट का समय लगेगा और वर्तमान $ रिकॉर्ड। मुझे लगता है कि एचटीएमएल और कोड अलग करने के लिए यह एक अच्छा तरीका है (वाईएमएमवी)। यदि आपके पास पहले से ही एक टेम्पलेटिंग सिस्टम है, तो आप इसके बजाय (और चाहिए!) अनुकूलित कर सकते हैं।

+0

मैं इसे कैसे बना सकता हूं? मैं MySQL में बहुत नौसिखिया हूं, मुझे आधार पता है और प्राथमिक कुंजी का उपयोग कैसे करें, लेकिन 'FULLTEXT' अनुक्रमणिका एक और चीज है जिसे मैं नहीं जानता ... –

1

यदि आप केवल mysql में खोजना चाहते हैं, तो FULLTEXT अनुक्रमणिका जाने का तरीका है।

जब खोज आप एक ही क्वेरी जनसंपर्क तालिका का उपयोग करना चाहिए के बाद से आप सबसे अधिक संभावना/परिणाम एचटीएमएल कि क्या तालिका मैच में पाया गया था के आधार पर अलग है लिंक का निर्माण करने की जरूरत है।

लेकिन अगर आप एक असली में देख विचार करना चाहिए अपाचे ल्यूसीन जैसे खोज इंजन।ज़ेंड के लिए इसका बहुत अच्छा कार्यान्वयन है जो किसी भी बाहरी सेवाओं पर निर्भर नहीं है http://framework.zend.com/manual/en/zend.search.lucene.html/ यह परिणामों को रैंक करने में आपकी सहायता करेगा, जो आप mysql के साथ कर सकते हैं और इसे बेहतर स्केल करना चाहिए। अच्छी प्रारूपण के लिए

+0

लिंक टूटा नहीं है लेकिन अजीब लगता है। मैं जानकारी तक नहीं पहुंच सकता, यह हमेशा ज़ेंड फ्रेमवर्क के परिचय को प्रदर्शित करता है। –

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