Cerveau mou ayant besoin d’aide pour une requête SQL!

J’ai le cerveau mou (4e mois de congé de maternité… 😉 ) et je n’arrive pas à faire ce que je veux faire en SQL. Quelqu’un peut m’aider?

J’ai la BD suivante (incomplète, mais c’est seulement pour soutenir ma question) :

BD - rating

Avec un contenu de la table rating qui ressemble à :

Extrait - table rating

J’aimerais appliquer l’association rule, c’est-à-dire calculer :

association rule

Où x est le film 260 et y est « tous les autres films, un à la fois ». En mots : calculer le nombre de personnes qui ont coté le film 260 et un autre film, divisé par le nombre d’utilisateurs ayant coté 260. Pour chaque film. Dans Excel, je l’ai fait comme ça :

Association rule - Excel

Je voudrais faire un left join de la table rating sur la table rating, avec le lien sur le id de l’utilisateur. Or, ça ne me donne pas le produit matriciel (ce à quoi je me serais attendue, avec des valeurs nulles pour les utilisateurs qui ont voté pour le film 260, mais pas l’autre), ça me donne seulement les enregistrements pour les utilisateurs qui ont coté les 2 films :

select 
  count(r1.rat_rating)/15*100 as compte, r2.fk_fil_id
from 
  rating as r1
  left join rating as r2 on r1.fk_use_id = r2.fk_use_id
where
  r1.fk_fil_id = 260 
  and r2.fk_fil_id != 260
group by r2.fk_fil_id
order by compte desc, r2.fk_fil_id
limit 0, 5

Je divise par 15 parce que je sais qu’il y a 15 utilisateurs ayant coté pour le film 260. Ce que je veux, c’est avoir le vrai nombre ici. Je pourrais faire une sous-requête qui compte le nombre de 260 dans la table rating, mais il me semble que ce serait très peu optimal, considérant qu’il recompte la même info chaque fois.

Est-ce qu’il y aurait quelque chose de plus optimal qu’une requête imbriquée dans le select?

Qu’est-ce qui m’échappe? (je répète : j’ai le cerveau mou!!)

Edit : la suite par ici!

2 commentaires pour “Cerveau mou ayant besoin d’aide pour une requête SQL!

  1. Pingback: Cerveau mou : la suite! | Michelle Deschênes

  2. Patrick Tremblay

    Bonjour Madame Deschenes,

    Je suis un ami d’Alex Migneault et il m’a fait parvenir votre requête.

    Je ne suis pas sûre de tout comprendre ce que vous recherchez… mais je me posais la question suivante :

    Quelques DBMS permettent de faire un query dans le FROM en le plaçant sous un alias…

    Pourquoi ne pas faire un
    SELECT COUNT(QUERYR1.rating260)/(COUNT(QUERYR2.ratingnot260)*100) AS COMPTE, R3.FK_FIL_ID
    FROM (SELECT * FROM RATING AS R1 WHERE R1.FK_FIL_ID=260) AS QUERYR1, (SELECT * FROM RATING AS R2 WHERE R2.FK_FIL_ID!=260) AS QUERYR2
    (…)

    Bien entendu, je fais ceci sur un coin de table entre deux appels clients… mais je crois que la structure proposée pourrait vous aider. 🙂