मैं एक उप-क्वेरी के लिए ललचाऊंगा जो एक व्यक्ति द्वारा सीखे गए सभी शब्दों को प्राप्त करता है और एक गिनती के साथ GROUP_CONCAT शब्दों के साथ खुद के खिलाफ जुड़ता है। तो दे रहे हैं:-
Octopus, NULL, 0
Dog, "Octopus", 1
Spoon, "Octopus,Dog", 2
तो उप क्वेरी कुछ इस तरह होगी:-
SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt
FROM words_learned sub0
LEFT OUTER JOIN words_learned sub1
ON sub0.userId = sub1.userId
AND sub0.order_learned < sub1.order_learned
WHERE sub0.userId = 1
GROUP BY sub0.idwords
देना
idwords excl_words older_words_cnt
1 NULL 0
2 1 1
3 1,2 2
फिर अन्य तालिकाओं के विरुद्ध इसके परिणामों में शामिल हों, उन लेखों की जाँच करें जहाँ मुख्य idwords मेल खाते हैं लेकिन अन्य में से कोई भी नहीं मिला है।
कुछ इस तरह (हालांकि बिना परीक्षण डेटा के रूप में परीक्षण नहीं किया गया):-
SELECT sub_words.idwords, words_inc.idArticle
(
SELECT sub0.idwords, SUBSTRING_INDEX(GROUP_CONCAT(sub1.idwords), ',', 10) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt
FROM words_learned sub0
LEFT OUTER JOIN words_learned sub1
ON sub0.userId = sub1.userId
AND sub0.order_learned < sub1.order_learned
WHERE sub0.userId = 1
GROUP BY sub0.idwords
) sub_words
INNER JOIN words words_inc
ON sub_words.idwords = words_inc.idwords
LEFT OUTER JOIN words words_exc
ON words_inc.idArticle = words_exc.idArticle
AND FIND_IN_SET(words_exc.idwords, sub_words.excl_words)
WHERE words_exc.idwords IS NULL
ORDER BY older_words_cnt
LIMIT 100
संपादित करें - 10 से अधिक शब्दों वाले लेखों को बाहर करने के लिए अपडेट किया गया है जो पहले से ही नहीं सीखे गए हैं।
SELECT sub_words.idwords, words_inc.idArticle,
sub2.idArticle, sub2.count, sub2.content
FROM
(
SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt
FROM words_learned sub0
LEFT OUTER JOIN words_learned sub1
ON sub0.userId = sub1.userId
AND sub0.order_learned < sub1.order_learned
WHERE sub0.userId = 1
GROUP BY sub0.idwords
) sub_words
INNER JOIN words words_inc
ON sub_words.idwords = words_inc.idwords
INNER JOIN
(
SELECT a.idArticle, a.count, a.content, SUM(IF(c.idwords_learned IS NULL, 1, 0)) AS unlearned_words_count
FROM Article a
INNER JOIN words b
ON a.idArticle = b.idArticle
LEFT OUTER JOIN words_learned c
ON b.idwords = c.idwords
AND c.userId = 1
GROUP BY a.idArticle, a.count, a.content
HAVING unlearned_words_count < 10
) sub2
ON words_inc.idArticle = sub2.idArticle
LEFT OUTER JOIN words words_exc
ON words_inc.idArticle = words_exc.idArticle
AND FIND_IN_SET(words_exc.idwords, sub_words.excl_words)
WHERE words_exc.idwords IS NULL
ORDER BY older_words_cnt
LIMIT 100
संपादित करें - उपरोक्त प्रश्न पर टिप्पणी करने का प्रयास करें:-
यह सिर्फ कॉलम का चयन करता है
SELECT sub_words.idwords, words_inc.idArticle,
sub2.idArticle, sub2.count, sub2.content
FROM
इस उप-क्वेरी में सीखे गए प्रत्येक शब्द के साथ-साथ अल्पविराम से अलग किए गए शब्दों की सूची बड़े ऑर्डर_लर्न्ड के साथ मिलती है। यह एक विशेष यूजर आईडी के लिए है
(
SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt
FROM words_learned sub0
LEFT OUTER JOIN words_learned sub1
ON sub0.userId = sub1.userId
AND sub0.order_learned < sub1.order_learned
WHERE sub0.userId = 1
GROUP BY sub0.idwords
) sub_words
यह केवल लेखों को प्राप्त करने के लिए है शब्दों (यानी, उपरोक्त उप क्वेरी से सीखे गए शब्द) का उपयोग किया जाता है
INNER JOIN words words_inc
ON sub_words.idwords = words_inc.idwords
इस उप क्वेरी में वे लेख मिलते हैं जिनमें 10 से कम शब्द होते हैं जो अभी तक विशेष उपयोगकर्ता द्वारा नहीं सीखे गए हैं।
INNER JOIN
(
SELECT a.idArticle, a.count, a.content, SUM(IF(c.idwords_learned IS NULL, 1, 0)) AS unlearned_words_count
FROM Article a
INNER JOIN words b
ON a.idArticle = b.idArticle
LEFT OUTER JOIN words_learned c
ON b.idwords = c.idwords
AND c.userId = 1
GROUP BY a.idArticle, a.count, a.content
HAVING unlearned_words_count < 10
) sub2
ON words_inc.idArticle = sub2.idArticle
यह जॉइन उन लेखों को खोजने के लिए है जिनमें पहली उप क्वेरी से अल्पविराम से अलग की गई सूची में शब्द हैं (यानी बड़े ऑर्डर वाले शब्द_लर्न किए गए)। यह एक बाएं बाहरी जॉइन के रूप में किया जाता है क्योंकि मैं पाए गए किसी भी शब्द को बाहर करना चाहता हूं (यह NULL की जांच करके WHERE क्लॉज में किया जाता है)
LEFT OUTER JOIN words words_exc
ON words_inc.idArticle = words_exc.idArticle
AND FIND_IN_SET(words_exc.idwords, sub_words.excl_words)
WHERE words_exc.idwords IS NULL
ORDER BY older_words_cnt
LIMIT 100