Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक जटिल MySQL क्वेरी लिखना

मैं एक उप-क्वेरी के लिए ललचाऊंगा जो एक व्यक्ति द्वारा सीखे गए सभी शब्दों को प्राप्त करता है और एक गिनती के साथ 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में महीने के हिसाब से ग्रुप कैसे करें

  2. PHP का उपयोग करके एक्सेल या सीएसवी को MySQL डेटा बेस पर कैसे अपलोड करें?

  3. डेटाबेस से प्राप्त करें लेकिन केवल पिछले 30 दिन

  4. एकाधिक तालिकाओं से पंक्तियां हटाएं

  5. mysql के साथ ग्रिडव्यू कैसे पॉप्युलेट करें?