Salut, tu dois normalement savoir quel est l'id du film, quel est l'id de l'utilisateur connecté et quel est l'id de la fiche membre.
Après tu fais 2 requêtes, une pour l'utilisateur et une pour le membre de la fiche.
SELECT * FROM note_films WHERE id_film = :id_film AND user_id = :user_id
avec :user_id égal à l'id de l'utilisateur puis à l'id de la fiche membre. Si chacune des requêtes te retourne 1 ligne alors il y a match.
A mon sens tu devrais aussi comparer les notes et intégrer ça à ton calcul d'affinité mais bon peut être dans un deuxième temps quand tu arriveras déjà à gérer la première partie.
Et si tu veux comparer pour tous les films, ben tu fais un peu pareil. Tu récupères d'abord tous les id de films notés par l'utilisateur.
SELECT id_film FROM notes_film WHERE user_id = :user_id
tu peux en extraire un tableau avec tous les id de films et faire un simple
count pour connaitre leur nombre.
Puis tu peux faire un
SELECT count(id) AS number FROM `notes_films` WHERE id_film IN (:film_ids) AND user_id = :id_membre
et comparer les deux nombres.
Faut savoir rester simple des fois. Tu peux peut être faire le tout en une seule requête bien chiadée quand t'es un as du SQL mais tu peux aussi le faire avec quelques requêtes simples sans te prendre la tête.
Après dans les faits c'est pas aussi simple. Ton premier utilisateur a peut être noté 10 films alors que le second en a noté 20. En admettant que le second utilisateur dans ses 20 films notés a noté les 10 films du premier utilisateur, le premier utilisateur aura une affinité de 100% alors que le deuxième aura une affinité de 50%. A moins que tu ignores les 10 films que le premier utilisateur n'a pas notés mais dans ce cas il suffirait d'avoir 1 seul film en commun pour avoir une affinité de 100%... ce qui me semble un peu léger.
Si tu veux que chacun voit le même score d'affinité l'un vis à vis de l'autre avec un calcul d'affinité concret, tu dois te baser sur les films notés en commun ET sur les notes données.
Par exemple en admettant que la notation aille de 1 à 5, tu pourrais considérer que la même note donne une affinité de 100% pour le film, que un 0 face à un 5 donne une affinité de 0%. Dans la logique un écart de note de 1 point vaut 20% d'affinité en moins (un 4 face à un 5 donne 80%, un 2 face à un 4 donne 60%, etc). Tu détermines donc pour chaque film en commun le score d'affinité puis tu fais une moyenne des affinités, total des affinités / nombre de films notés en commun.
Je te laisse un algo en pseudo code avec quelques fonctions php utiles pour te simplifier la tâche. Le calcul de l'affinité par film est à vérifier mais je crois qu'il est bon.
// récupérer ids films utilisateur
// récupérer ids films membre
// tableau ids films communs = array_intersect(tableau ids films utilisateur, tableau ids films membre)
// initialiser tableau affinités
// boucle sur tableau ids films communs
// récupérer note utilisateur
// récupérer note membre
// calcul affinité film : 100 - abs(note utilisateur - note membre) * (100 / note max possible)
// ajouter affinité film dans tableau affinités
// fin boucle
// calcul affinité membres : array_sum(tableau affinités) / count(tableau affinités) ♥
Salut, tu dois normalement savoir quel est l'id du film, quel est l'id de l'utilisateur connecté et quel est l'id de la fiche membre.
Après tu fais 2 requêtes, une pour l'utilisateur et une pour le membre de la fiche.
[PHP]SELECT * FROM note_films WHERE id_film = :id_film AND user_id = :user_id[/PHP] avec :user_id égal à l'id de l'utilisateur puis à l'id de la fiche membre. Si chacune des requêtes te retourne 1 ligne alors il y a match.
A mon sens tu devrais aussi comparer les notes et intégrer ça à ton calcul d'affinité mais bon peut être dans un deuxième temps quand tu arriveras déjà à gérer la première partie.
Et si tu veux comparer pour tous les films, ben tu fais un peu pareil. Tu récupères d'abord tous les id de films notés par l'utilisateur.
[PHP]SELECT id_film FROM notes_film WHERE user_id = :user_id[/PHP] tu peux en extraire un tableau avec tous les id de films et faire un simple [b]count[/b] pour connaitre leur nombre.
Puis tu peux faire un [PHP]SELECT count(id) AS number FROM `notes_films` WHERE id_film IN (:film_ids) AND user_id = :id_membre[/PHP] et comparer les deux nombres.
Faut savoir rester simple des fois. Tu peux peut être faire le tout en une seule requête bien chiadée quand t'es un as du SQL mais tu peux aussi le faire avec quelques requêtes simples sans te prendre la tête. ;)
Après dans les faits c'est pas aussi simple. Ton premier utilisateur a peut être noté 10 films alors que le second en a noté 20. En admettant que le second utilisateur dans ses 20 films notés a noté les 10 films du premier utilisateur, le premier utilisateur aura une affinité de 100% alors que le deuxième aura une affinité de 50%. A moins que tu ignores les 10 films que le premier utilisateur n'a pas notés mais dans ce cas il suffirait d'avoir 1 seul film en commun pour avoir une affinité de 100%... ce qui me semble un peu léger.
Si tu veux que chacun voit le même score d'affinité l'un vis à vis de l'autre avec un calcul d'affinité concret, tu dois te baser sur les films notés en commun ET sur les notes données.
Par exemple en admettant que la notation aille de 1 à 5, tu pourrais considérer que la même note donne une affinité de 100% pour le film, que un 0 face à un 5 donne une affinité de 0%. Dans la logique un écart de note de 1 point vaut 20% d'affinité en moins (un 4 face à un 5 donne 80%, un 2 face à un 4 donne 60%, etc). Tu détermines donc pour chaque film en commun le score d'affinité puis tu fais une moyenne des affinités, total des affinités / nombre de films notés en commun. 8-)
Je te laisse un algo en pseudo code avec quelques fonctions php utiles pour te simplifier la tâche. Le calcul de l'affinité par film est à vérifier mais je crois qu'il est bon.
[PHP]// récupérer ids films utilisateur
// récupérer ids films membre
// tableau ids films communs = array_intersect(tableau ids films utilisateur, tableau ids films membre)
// initialiser tableau affinités
// boucle sur tableau ids films communs
// récupérer note utilisateur
// récupérer note membre
// calcul affinité film : 100 - abs(note utilisateur - note membre) * (100 / note max possible)
// ajouter affinité film dans tableau affinités
// fin boucle
// calcul affinité membres : array_sum(tableau affinités) / count(tableau affinités) ♥
[/PHP]