我有两个sql,它给了我相同的结果:
查询1:
SELECT
u.*, COUNT(po.order_id) products_count
FROM (SELECT * FROM orders o WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)) o
LEFT JOIN products_orders po ON po.order_id=o.id
JOIN users u ON u.id=o.user_id
GROUP BY po.order_id
和查询2:
SELECT
u.*, o.id order_id, COUNT(po.order_id) products_count
FROM users u
JOIN orders o ON o.user_id=u.id
LEFT JOIN products_orders po ON po.order_id=o.id
WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)
GROUP BY po.order_id
答案 0 :(得分:0)
查询与您选择不同的列不完全相同 你可以直接在on子句中添加where条件,避免在哪里 使用subselect进行查询应该更快..因为不需要临时表来存储子查询的结果
{{1}}
检查避免在哪里使用
答案 1 :(得分:0)
通常,JOIN比子查询更有效,并反映在public class Test {
public static void main(String[] args) {
Object a = null;
System.out.println(getThing(a));
}
private static boolean getThing(Object o) {
return o == null ? null : Boolean.TRUE;
}
}
输出中。这是因为使用子查询需要动态创建虚拟表,然后使用该表进行查询。在现有表上使用JOIN会跳过此步骤,并允许优化器以索引或缓存数据的形式利用此表的知识。
这里EXPLAINs相等的可能原因是你的子查询有多简单。由于您只是使用where条件执行select all,优化器通常可以注意到这一点并解析子查询和表上的JOIN并稍后应用WHERE。因此,优化器在执行之前有效地将子查询版本重写为JOIN版本。