sql >> Database teknologi >  >> RDS >> Mysql

At skrive en kompleks MySQL-forespørgsel

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 


  1. Hvordan bruger man JOIN i Yii2 Active Record til relationel model?

  2. CSV vs MySQL ydeevne

  3. mysql:Hvordan kan jeg fjerne tegn ved starten eller slutningen af ​​feltet

  4. MySQL - Brug If Then Else i MySQL UPDATE eller SELECT Queries