Vì ba tổng hợp này đến từ cùng một bảng với cùng một WHERE
điều kiện, bạn không cần lựa chọn con. Tất cả ba tập hợp đang hoạt động trên cùng một nhóm hàng (không có GROUP BY
được chỉ định, vì vậy một hàng cho toàn bộ bảng), vì vậy tất cả chúng đều có thể tồn tại trong SELECT
liệt kê trực tiếp.
SELECT
SUM(number) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
Nếu bất kỳ tổng hợp nào cần dựa trên các điều kiện khác nhau, bạn sẽ lọc trong WHERE
, sau đó bạn sẽ cần phải sử dụng một lựa chọn con cho các điều kiện khác nhau, hoặc thực hiện một phép nối cacte. Chọn con này và LEFT JOIN
sau phương thức phải tương đương, phù hợp với hiệu suất đối với các tổng hợp chỉ trả về một hàng:
SELECT
/* Unique filtering condition - must be done in a subselect */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
Hoặc tương đương với truy vấn ở trên, bạn có thể LEFT JOIN
chống lại truy vấn con không có ON
mệnh đề . Điều này chỉ nên được thực hiện trong các tình huống khi bạn biết truy vấn con sẽ chỉ trả về một hàng. Nếu không, bạn sẽ kết thúc với một sản phẩm cacte - bao nhiêu hàng được trả về bởi một bên của phép nối nhân với số hàng được trả về bởi phía bên kia.
Điều này rất hữu ích nếu bạn cần trả về một vài cột với một tập hợp WHERE
điều kiện mệnh đề và một vài cột có tập hợp WHERE
khác điều kiện, nhưng chỉ một hàng từ mỗi bên của JOIN
. Trong trường hợp này, JOIN
sẽ nhanh hơn hơn để làm hai các lựa chọn con có cùng WHERE
mệnh đề.
Điều này sẽ nhanh hơn ....
SELECT
/* this one has two aggregates sharing a WHERE condition */
subq.number_sum_filtered,
subq.number_max_filtered,
/* ...and two aggregates on the main table with no WHERE clause filtering */
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`
LEFT JOIN (
SELECT
SUM(number) AS number_sum_filtered,
MAX(number) AS number_max_filtered
FROM `table`
WHERE `somecolumn = `somevalue`
) subq /* No ON clause here since there's no common column to join on... */
Hơn cái này ...
SELECT
/* Two different subselects each over the same filtered set */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered,
(SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered,
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`