J'utilise Postgresql et il est coûteux d'utiliser count. Ce que j'essaie de faire, c'est de compter un identifiant de table dans un autre et de mettre à jour le numéro de compte. Disons que le premier tableau correspond aux catégories

Id

Nom

Num_count

L'autre table est Restaurants

Id

Nom

Category_id

Je souhaite mettre à jour categories.num_count en fonction de la valeur de comptage de Restaurants.category_id. Je peux faire ça avec Update Categories set Categories.num_count = (select count(*) from Restaurants where Restaurants.category_id = Categories.id) pourtant cela a pris trop de temps. J'ai essayé de faire quelque chose comme itérer les restaurants 1 fois et mettre à jour Categories.num_count ++ mais je ne pouvais pas le faire correctement car cela rend toutes les catégories num_count 1. Il cesse de fonctionner après 1 exécution.

Existe-t-il une meilleure façon de faire cela avec SQL?

0
mbaydar 29 déc. 2015 à 21:19

2 réponses

Meilleure réponse
update categories c
set num_count = r.num_count
from (
    select category_id, count(*) as num_count
    from restaurants
    group by category_id
) r
where c.id = r.category_id
1
Clodoaldo Neto 29 déc. 2015 à 18:44

Que diriez-vous:

with countPerCategory (categoryId, numCount) as
{
  select category_id, count(*) from Restaurants
  group by category_id
}
update Categories set num_count = countPerCategory.numCount
from countPerCategory
where Categories.id = countPerCategory.categoryId;

PS: Je trouve que c'est une chose inutile à faire. Vous devez mettre à jour num_count chaque fois qu'un restaurant est ajouté ou supprimé.

1
Cetin Basoz 29 déc. 2015 à 18:32