2010-11-11 3 views
6

आइए कहें कि मेरे पास विषयों के साथ कई रिश्तों के साथ लेखों की एक तालिका है। किसी आलेख को सौंपा गया प्रत्येक विषय में type फ़ील्ड है जिसमें 3 में से 3 मान AND, NOT, और OR शामिल हो सकते हैं।mysql क्वेरी के साथ AND, OR और नहीं

Articles 
    id 
    .... 

Topics 
    id 
    .... 

ArticleTopics 
    article_id 
    topic_id 
    type 

मैं एक प्रश्न है कि रिटर्न सभी लेख है कि कहते हैं बनाना चाहते हैं:

ALL of the following topics: 1, 2, 3 (AND association) 
    AND 
ANY of the following topics: 4, 5, 6 (OR association) 
    AND 
NONE of the following topics 7, 8 (NOT association) 

मैं इस क्वेरी बनाने के बारे में जाते हैं?

अग्रिम धन्यवाद!

+0

होमवर्क? ...;) – Select0r

+0

काम के लिए नहीं, मैंने लगभग 12 वर्षों में होमवर्क नहीं किया है! – Lizard

+0

क्या 'ArticleTopics (article_id, topic_id)' पर कोई अनन्य अनुक्रमणिका है? 'टाइप' कॉलम के पीछे सटीक अर्थ क्या है? 'ArticleTopics' तालिका में प्रवेश न करने के बजाय, 'नहीं' प्रकार क्यों है? – outis

उत्तर

1

सभी और नहीं भागों बहुत सरल कर रहे हैं, तो आप सिर्फ उन्हें ands के साथ श्रृंखला:

चयन Y से एक्स, जहां एक और बी और सी और डी नहीं और ई न कि ई।

एवं अन्य के बीच जाना: WHERE ((ए और बी और सी) और (घ या ई या च)) और नहीं जी न कि ज

साथ कम संख्या की जगह Y से

चयन एक्स तुलना और आप कर रहे हैं। तो यदि आप कोड में ऐसा करना चाहते हैं, तो अपनी परिस्थितियों को व्यवस्थित करें और फिर उन्हें एक स्ट्रिंग के रूप में एक साथ श्रृंखलाबद्ध करें। एसक्यूएल-सम्मिलन से बचने के लिए सावधान रहें।

+3

फ़ील्ड एक रिश्ते पर हैं, इसलिए यह उतना आसान नहीं है। –

0

यदि मैं यह सही ढंग से

SELECT * FROM ArticleTopics where type = 'AND' 
UNION 
    SELECT * FROM ArticleTopics where type = 'OR' limit 1 

मैं 'कोई भी' तुम्हारा मतलब 'किसी भी एक' द्वारा मान मिलता है। आप लेखों में अपने आप विषयों में शामिल हो सकते हैं, यह मामूली है।

0
SELECT a.id, a.name 
    FROM Articles a, ArticleTopics arto 
    WHERE arto.article_id = a.id 
    AND 
     ((arto.topic_id = 1 AND arto.type like 'AND') AND (arto.topic_id = 2 AND arto.type like 'AND') AND (arto.topic_id = 3 AND arto.type like 'AND')) 
    AND 
     ((arto.topic_id = 4 AND arto.type like 'OR') AND (arto.topic_id = 5 AND arto.type like 'OR') AND (arto.topic_id = 6 AND arto.type like 'OR')) 
    AND 
     ((arto.topic_id = 7 AND arto.type like 'NOT') AND (arto.topic_id = 8 AND arto.type like 'NOT')) 
+0

नोट करें कि आप उन्हें चार रिक्त स्थान इंडेंट करके कोड के रूप में कोड के रूप में प्रारूपित कर सकते हैं। संपादक टूलबार में "101 \ n010" बटन आपके लिए यह करता है। फ़ॉर्मेटिंग पर अधिक जानकारी और युक्तियों के लिए संपादक टूलबार में नारंगी प्रश्न चिह्न पर क्लिक करें। – outis

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