Cách khắc phục nhanh chóng là bộ lọc trong truy vấn con:
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND s.id IN(
SELECT g.site_id
FROM gstats g
WHERE g.start_date > '2015-04-30' AND g.site_id = s.id
GROUP BY g.site_id
HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC
Vì nếu không, bạn thực hiện truy vấn nhóm như vậy cho mọi ứng viên có thể. Chúng tôi có thể làm cho điều này thanh lịch hơn với EXISTS
:
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND EXISTS (
SELECT 1
FROM gstats g
WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC
Nhưng chúng ta vẫn chưa hoàn thành, bây giờ chúng ta sẽ sử dụng EXISTS
cho mọi yếu tố. Điều đó thật kỳ lạ vì truy vấn chỉ phụ thuộc vào s.id
, vì vậy nó chỉ phụ thuộc vào nhóm , không phải các hàng riêng lẻ. Vì vậy, một tiềm năng tăng tốc, nhưng điều này phụ thuộc vào kích thước của các bảng, v.v. là chuyển điều kiện sang HAVING
tuyên bố:
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
GROUP BY s.id
ORDER BY dcount ASC
HAVING EXISTS (
SELECT 1
FROM gstats g
WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
HAVING SUM(g.results) > 100
)