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) :
Avec un contenu de la table rating qui ressemble à :
J’aimerais appliquer l’association rule, c’est-à-dire calculer :
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 :
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!
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. 🙂