Cách thông thường để chia tay OR
các vị từ bằng UNION
.
Lưu ý rằng ví dụ của bạn không phù hợp với các chỉ mục của bạn. Ngay cả khi bạn đã bỏ qua field1
từ vị ngữ, bạn sẽ có field2 >= 1000 OR field3 >= 2000
, không thể sử dụng chỉ mục. Nếu bạn có các chỉ mục trên (field1, field2)
và (field1,field3)
hoặc field2
hoặc field3
riêng biệt, bạn sẽ nhận được một truy vấn nhanh hợp lý.
SELECT COUNT(*) FROM
(SELECT * FROM table WHERE field1 = 'value' AND field2 >= 1000
UNION
SELECT * FROM table WHERE field1 = 'value' AND field3 >= 2000) T
Lưu ý rằng bạn phải cung cấp bí danh cho bảng dẫn xuất, đó là lý do tại sao truy vấn con được đặt bí danh là T
.
Một ví dụ trong thế giới thực. Tên cột và bảng đã được ẩn danh!
mysql> SELECT COUNT(*) FROM table;
+----------+
| COUNT(*) |
+----------+
| 3059139 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(*) FROM table WHERE columnA = value1;
+----------+
| COUNT(*) |
+----------+
| 1068 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(*) FROM table WHERE columnB = value2;
+----------+
| COUNT(*) |
+----------+
| 947 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(*) FROM table WHERE columnA = value1 OR columnB = value2;
+----------+
| COUNT(*) |
+----------+
| 1616 |
+----------+
1 row in set (9.92 sec)
mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) T;
+----------+
| COUNT(*) |
+----------+
| 1616 |
+----------+
1 row in set (0.17 sec)
mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION ALL SELECT * FROM table WHERE columnB = value2) T;
+----------+
| COUNT(*) |
+----------+
| 2015 |
+----------+
1 row in set (0.12 sec)