une - variable mysql




MySQL: écrire une requête complexe (2)

J'ai 3 tables. Ici, je poste son diagramme de base de données.

Vous pouvez télécharger le code de base de données ici: https://www.dropbox.com/s/lk956afaxv147h0/testS.sql?dl=0

Maintenant, en utilisant cette base de données et en utilisant "seulement" mysql, j'ai besoin de faire le travail ci-dessous.

1) Étant donné un identifiant d'utilisateur, il devrait obtenir une liste de tous les mots connus par cet utilisateur, triés dans l'ordre de la commande à partir duquel ils ont été appris. En d'autres termes, les mots les plus récemment appris seront en haut de la liste.

2) Vous obtiendrez une liste de tous les articles qui contiennent ce mot particulier de la table "Mots"

3) Vous allez scanner cette liste et retourner tous les enregistrements de la table "Article" qui contiennent un maximum de 10 mots "inconnus". En d'autres termes, si cet article contient plus de 10 mots qui n'apparaissent pas dans la liste de vocabulaire de l'utilisateur (tiré de la table "Words_Learned"), il est exclu de la liste.

4) Ensuite, vous passez à l'enregistrement suivant dans la liste à partir de l'étape 1. Vous répétez le même processus, sauf si vous ignorez les articles qui ont été renvoyés à l'étape 3 ou exclus dans le processus de filtrage à l'étape 3.

Pour réaliser ce processus, j'ai fait ci-dessous

SELECT `words_learned`.`idwords`,
Words.`idArticle`
FROM words_learned
INNER JOIN Words ON Words.idWords = Words_Learned.`idwords`
WHERE words_learned.userId = 1
ORDER BY Words_Learned.`order` DESC

Dans ma question, j'ai abordé les points 1 et 2. Mais que devrais-je faire pour couvrir les points 3 et 4?


En d'autres termes: Montrer tous les mots appris pour lesquels il n'existe pas d'articles difficiles à lire. Je ne le fais pas tout à fait étape par étape comme suggéré. Voici ma requête:

select *
from words_learned
where userid = 1
and not exists
(
  -- word being used in at least one article with too many unknown words
  select *
  from words
  where words.idwords = words_learned.idwords
  and words.idarticle in
  (
    -- articles with more then 10 unknown words
    select w.idarticle
    from words w
    left join words_learned l on l.idwords = w.idwords and l.userid = 1
    group by w.idarticle
    having count(*) - count(l.idwords) > 10
  )
)
order by `order` desc;

Voici un violon SQL: http://sqlfiddle.com/#!2/6de6a/4 .


Réponse pour 1) Compte tenu d'un identifiant d'utilisateur, il devrait obtenir une liste de tous les mots connus par cet utilisateur, triés dans l'ordre de revese à partir duquel ils ont été appris. En d'autres termes, les mots les plus récemment appris seront en haut de la liste.

SELECT ar.content 
FROM article ar INNER JOIN words ws ON ar.idArticle = ws.idArticle 
  INNER JOIN words_learned wl ON wl.idwords = ws.idwords AND wl.userid = @givenID
ORDER BY ar.content DESC

Ici @givenID est fourni ID utilisateur et à mon sens le contenu tiendra la valeur des mots appris

2) Vous obtiendrez une liste de tous les articles qui contiennent ce mot particulier de la table "Mots"

SELECT 
    * 
FROM 
    article ar 
INNER JOIN 
    words ws 
ON 
    ar.idArticle = ws.idArticle 
AND 
    ws.idwords is like '%pe%'

ceci sélectionnera tous les mots ayant la sous-chaîne pe comme le tireur d'élite etc. Vous pouvez également sélectionner uniquement le contenu de l'article en remplaçant * par ar.content





join