PostgreSQL LEFT JOIN:意外的行数乘法
使用多个 LEFT JOIN 的 PostgreSQL 9.1 查询意外地增加了行数,而不是保留它们。 该查询旨在检索用户 ID、帐户余额、杂货店访问计数和鱼市访问计数。 有缺陷的查询导致计数不正确,显示重复值而不是实际计数。
此问题是由 PostgreSQL 从左到右的 JOIN 处理顺序引起的。 后续联接会复制早期联接中的行,从而导致计数膨胀。例如,如果访问杂货店 3 次,鱼市访问 12 次,则结果错误地显示每次访问 12 个条目,而不是预期的 3 个和 12 个。
解决方案包括在加入之前预先汇总访问次数。 这避免了行乘法问题。更正后的查询是:
SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, count(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, count(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;
此修改后的查询正确返回每个用户访问杂货店和鱼市的个人计数,解决了乘法问题。 例如,如果用户访问了 3 次杂货店和 4 次鱼市,输出会准确反映这一点,避免原始查询中出现的错误重复。
以上是为什么我的 PostgreSQL LEFT JOIN 查询会乘以计数而不是保留它们?的详细内容。更多信息请关注PHP中文网其他相关文章!