Chỉ một ORDER BY
mệnh đề có thể được định nghĩa cho một UNION
'd truy vấn. Không thành vấn đề nếu bạn sử dụng UNION
hoặc UNION ALL
. MySQL không hỗ trợ LIMIT
mệnh đề trên các phần của UNION
'd truy vấn, nhưng nó tương đối vô dụng nếu không có khả năng xác định thứ tự.
MySQL cũng thiếu các chức năng xếp hạng, mà bạn cần phải xử lý các khoảng trống trong dữ liệu (bị thiếu do các mục nhập bị xóa). Cách thay thế duy nhất là sử dụng một biến tăng dần trong câu lệnh SELECT:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Bây giờ chúng ta có thể nhận được danh sách các hàng được đánh số liên tục, vì vậy chúng ta có thể sử dụng:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Sử dụng 7 làm giá trị cho @midpoint, @midpoint - ROUND(@midpoint/2)
trả về giá trị 4
. Để có tổng cộng 10 hàng, hãy đặt giá trị @upperlimit thành 10. Đây là truy vấn đầy đủ:
SELECT x.*
FROM (SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t,
(SELECT @rownum := 0) r) x
WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit
Nhưng nếu bạn vẫn muốn sử dụng LIMIT
, bạn có thể sử dụng:
SELECT x.*
FROM (SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t,
(SELECT @rownum := 0) r) x
WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
LIMIT 10