我有一个数据库,里面有一些这样的表:
- fruitsTable
id name numberOfPeople
1 apple 3
2 orange 4
3 cherry 1
- peopleTable
person fruit
john apple
john orange
john cherry
jack apple
jack orange
ryan apple
ryan orange
meg orange
想想peopleTable每天都在变化,它由数以万计的行组成。此外,水果表有一千多行。
如何定期计算numberOfPeople列?
我计划每天设置一个cron作业,它将触发SQL命令来计算数字。
假设我在SQL中没有使用这些JOIN命令的经验,那么在没有任何性能问题的情况下,我需要使用什么样的SQL命令?
您可能不应该存储该字段,否则如果经常更改peopleTable,它将非常频繁地过时。只要你想显示它,就简单地计算它。
但如果你坚持拥有它,你可以做到:
UPDATE fruitsTable f
SET f.numberOfPeople = (
SELECT COUNT(*)
FROM peopleTable p
WHERE p.fruit = f.name
)
如果你想在每次需要时更新人数的餐桌水果,你可以这样做:
SELECT f.id, f.name, COUNT(*) AS numberOfPeople
FROM fruitsTable f
INNER JOIN peopleTable p ON p.fruit = f.name
GROUP BY f.id, f.name
如果你有没有任何人与之关联的水果,并且你仍然想计数它们(0),你可以将INNER JOIN更改为LEFT JOIN。
我建议您将peopleTable
表更改为遵循结构
peopleTable
person fruit_id
john 1
...
根据这个问题,你需要遵循sql
SELECT a.id, COUNT(*) as count FROM fruitsTable a
LEFT JOIN peopleTable b ON a.id = b.fruit_id
GROUP BY a.id
这将输出以下(示例数据)
id count
1 2
2 4
...
并更新查询
UPDATE fruitTable a SET numberOfPeople = (
SELECT COUNT(*) FROM peopleTable b WHERE a.id = b.fruit_id GROUP BY b.fruit_id
);
这将在不需要水果的情况下得到你的要求Table,不取决于来自people的水果Table实际上在水果Table 中
select fruit, count(*) as 'Count' from peopleTable
group by fruit
order by fruit asc
如果两个表都需要存在,我的另一个解决方案与Filipe相同。