MySQL: Escribir una consulta compleja

Tengo 3 tablas. Aquí estoy publicando su diagtwig de database.

enter image description here

Puede download el código de DB desde aquí: https://www.dropbox.com/s/lk956afaxv147h0/testS.sql?dl=0

Ahora, usando esta database y usando "solo" mysql, necesito hacer el siguiente trabajo.

1) Dado un ID de usuario, debe get una list de todas las palabras conocidas por este usuario, orderadas en el order reverente del que fueron aprendidas. En otras palabras, las palabras aprendidas más recientes estarán en la parte superior de la list.

2) Obtendrá una list de todos los artículos que contienen esta palabra particular de la tabla "Palabras"

3) Explorará esta list y devolverá todos los loggings de la tabla "Artículo" que contienen un máximo de 10 palabras "desconocidas". En otras palabras, si ese artículo contiene más de 10 palabras que no aparecen en la list de vocabulario del usuario (extraído de la tabla "Words_Learned"), entonces se excluye de la list.

4) Luego, pasa al siguiente logging de la list desde el paso 1. Repite el mismo process, excepto que omitas los artículos que fueron devueltos del paso 3 o excluidos como parte del process de filtrado en el paso 3.

Para lograr este process, hice lo siguiente

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 

En mi consulta, he cubierto los puntos 1 y 2. ¿Pero qué debería hacer para cubrir los puntos 3 y 4?

En otras palabras: muestre todas las palabras aprendidas para las cuales no existen artículos difíciles de leer. No lo hago paso a paso como se sugiere. Aquí está mi consulta:

 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; 

Aquí hay un violín de SQL: http://sqlfiddle.com/#!2/6de6a/4 .

Respuesta para 1) Dado un ID de usuario, debe get una list de todas las palabras conocidas por este usuario, orderadas en el order reverente del que fueron aprendidas. En otras palabras, las palabras aprendidas más recientes estarán en la parte superior de la list.

 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 

Aquí @givenID se proporciona identificación de usuario y, para mi comprensión, el contenido tendrá valor de palabras aprendidas

2) Obtendrá una list de todos los artículos que contienen esta palabra particular de la tabla "Palabras"

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

esto seleccionará todas las palabras que tengan pe subcadena como francotirador, etc. También puede seleccionar solo el contenido del artículo reemplazando * con ar.content