调试 SQL LEFT JOIN:准确的访问计数
在 SQL 中使用多个 LEFT JOIN
来统计不同表的访问次数时会出现一个常见问题。 此示例使用三个表:users
、grocery
和 fishmarket
。 旨在统计每个用户对杂货店和鱼市场的访问次数的查询会产生不准确的结果。
问题源于连接的顺序性质。 一种简单的方法首先连接 users
和 grocery
,为每个具有非空 account_balance
的用户及其杂货店访问创建一行。 随后使用 fishmarket
进行连接,然后错误地将每个用户的杂货店访问计数乘以鱼市访问计数。 这导致访问总量膨胀。
解决方案涉及在将访问计数连接到users
表之前重组查询以聚合访问计数。 这是使用两个相关子查询有效完成的。每个子查询独立地计算 grocery
或 fishmarket
表的访问次数,并按 user_id
分组。 然后将这些聚合计数连接到 users
表,确保准确的访问总数。
这是使用子查询的更正查询:
<code class="language-sql">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;</code>
此修改后的查询为每个用户提供准确、独立的杂货店和鱼市访问计数,解决了原始查询的乘法错误。
以上是为什么我的两个 SQL LEFT JOINS 返回不正确的访问计数?的详细内容。更多信息请关注PHP中文网其他相关文章!