-2
votes

Sélectionnez Utilisateurs avec au moins 2 produits identiques

Table des utilisateurs:

user_id product_id
1 2
1 4
1 5
2 4
2 5
2 7
3 1
3 5
3 4
3 2
4 1


1 commentaires

Vous pouvez trouver paires d'utilisateurs qui partagent au moins 2 produits. Est-ce que c'est ce que tu veux?


5 Réponses :


0
votes

Une option est d'utiliser une jointure auto: xxx

Demo

L'idée ici est d'essayer de faire correspondre à chacun des enregistrements d'un utilisateur donné à des enregistrements d'un utilisateur différent, mais d'avoir le même produit. L'étape d'agrégation puis vérifie si un utilisateur donné a toujours au moins deux produits après la jointure intérieure, ce qui implique qu'en fait, il a au moins deux produits en commun avec un autre utilisateur.

Les utilisateurs correspondants ici sont: John, Mark et Scott


7 commentaires

Il faut trop de temps sur une grande table. J'ai des index sur tous les champs. Y a-t-il une autre façon de l'écrire?


J'ai des index sur tous les champs ... mais cela ne signifie pas que les indices sont optimaux, voire que Postgres utilise l'un d'entre eux. Vous devriez éditer votre question et nous dire quels indices vous avez.


Un index sur (produit_id, user_id) sur le tableau user_products peut aider, en supposant que Postgres choisit de l'utiliser. Les requêtes d'agrégation ont tendance à prendre des ressources. Attendez-vous donc un peu de temps pour la conduire pour une très grande table.


J'ai dit ça tort. Aucun index sur tous les champs, mais index requis. J'ai une requête analysée avec expliquer. Il y a environ 100 milliers d'enregistrements dans la table des utilisateurs. Et 600 milliers de produits. J'ai abandonné la requête, parce que ça a pris trop de temps


mais index requis ... Quels index ? Pouvez-vous nous montrer?


J'ai des utilisateurs.user_id comme clé primaire. Et index sur (product_id, user_id)


Ensuite, je n'ai aucune autre idée sur la manière d'améliorer la performance. Vous voudrez peut-être rechercher des magasins de données alternatifs, tels que GraphQL, conçu pour fonctionner avec les réseaux / relations telles que vos données.



-1
votes

espoir peut vous aider xxx

résultat:

Entrez la description de l'image ici


3 commentaires

Cela renvoie tous les utilisateurs qui ont plus d'un produit, et non des utilisateurs ayant deux produits ou plus en commun avec d'autres utilisateurs.


oh désolé, j'ai mal compris la question


Apparemment aussi j'ai : -)



0
votes

Un auto rejoindre est la bonne approche, mais je pense que la bonne logique est la suivante: xxx

Si vous souhaitez la liste des produits, vous pouvez inclure array_agg (distinct1.product_id ) .


0 commentaires

0
votes

Vous pouvez également essayer aussi:

select distinct b.user_id from #UserProduct b
join (
select count(1) cnt,product_id from #UserProduct
group by product_id
having count(1) = 3)  c
on b.product_id=c.product_id


0 commentaires

0
votes

Cette fois, j'espère peut vous aider xxx

résultat:

 Entrez la description de l'image ici


0 commentaires