Jeg ville være fristet til at have en underforespørgsel, der henter alle de ord, en person har lært og slutte sig til sig selv, med ordene GROUP_CONCAT sammen med en optælling. Så giver:-
Blæksprutte, NULL, 0Hund, "Blæksprutte", 1ske, "Blæksprutte,Hund", 2
Så underforespørgslen ville være noget som:-
SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cntFROM words_learned sub0LEFT YDRE JOIN words_learned sub1ON sub0.userId =sub1.userId =sub1.userId.subordlearned0 userId =1GROUP BY sub0.idwords
giver
idwords excl_words older_words_cnt1 NULL 02 1 13 1,2 2
Foren derefter resultaterne af dette med de andre tabeller, og tjek efter artikler, hvor de vigtigste idwords matcher, men ingen af de andre er fundet.
Noget som dette (selv om det ikke er testet som ingen testdata):-
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 0_leFTarned underords YDRE JOIN words_learned sub1 ON sub0.userId =sub1.userId AND sub0.order_learned
EDIT - opdateret til at udelukke artikler med mere end 10 ord, som ikke allerede er lært.
SELECT sub_words.idwords, words_inc.idArticle,sub2.idArticle, sub2.count, sub2.contentFROM( SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt words_learned sub0 LEFT OUTER JOIN words_learned sub1 ON sub0.userId =sub1.userId AND sub0.order_learned
EDIT - forsøg på at kommentere ovenstående forespørgsel:-
Dette vælger blot kolonnerne
VÆLG sub_words.idwords, words_inc.idArticle,sub2.idArticle, sub2.count, sub2.contentFROM
Denne underforespørgsel får hvert af ordene lært sammen med en kommasepareret liste over ordene med en større order_learned. Dette er for et bestemt bruger-id
( SELECT sub0.idwords, GROUP_CONCAT(sub1.idwords) AS excl_words, COUNT(sub1.idwords) AS older_words_cnt FRA words_learned sub0 VENSTRE YDRE JOIN words_learned sub1 PÅ sub0.userId =sub1.userned.userned. sub1.order_learned WHERE sub0.userId =1 GROUP BY sub0.idwords) sub_words
Dette er blot for at få de artikler, ordene (dvs. ordene lært fra ovenstående underforespørgsel) bruges i
INNER JOIN words words_incON sub_words.idwords =words_inc.idwords
Denne underforespørgsel henter de artikler, som har mindre end 10 ord i dem, som endnu ikke er lært af den pågældende bruger.
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 VENSTRE YDRE JOIN words_learned c PÅ b.idwords =c.idwords OG c.userId =1 GRUPPE AF a.idArticle, a.count, a.content HAR unlearned_words_count <10) sub2ON words_inc.idArticle =sub<2.idArticle /kode>
Denne join er at finde artikler, der har ord i den kommaseparerede liste fra den 1. underforespørgsel (dvs. ord med en større order_learned). Dette gøres som en LEFT OUTER JOIN, da jeg vil udelukke alle ord, der findes (dette gøres i WHERE-sætningen ved at markere NULL)
VENSTRE YDRE JOIN ord words_excON words_inc.idArticle =words_exc.idArticleAND FIND_IN_SET(words_exc.idwords, sub_words.excl_words)HVOR words_exc.idwords ER NULLORDER BY older_codes