Bất kỳ biểu thức nào trong SQL chỉ được tham chiếu đến các cột trong một hàng (chặn các truy vấn con).
A JOIN
có thể được sử dụng để tạo hai hàng khác nhau thành một hàng của tập kết quả.
Vì vậy, bạn có thể so sánh các giá trị trên các hàng khác nhau bằng cách tự nối. Dưới đây là một ví dụ cho thấy việc kết nối từng hàng với mọi hàng khác được liên kết với cùng một ứng dụng khách (không bao gồm việc nối một hàng với chính nó):
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
Bây giờ bạn có thể viết biểu thức so sánh các cột. Ví dụ:để hạn chế truy vấn ở trên đối với những truy vấn mà field1 khác nhau:
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;
Bạn không chỉ định loại so sánh nào bạn cần thực hiện, vì vậy tôi sẽ để lại điều đó cho bạn. Điểm mấu chốt là nói chung, bạn có thể sử dụng tự nối để so sánh các hàng trong một bảng nhất định.
Lấy lại nhận xét của bạn và làm rõ:Được rồi, vì vậy "sự khác biệt" của bạn không chỉ đơn giản là giá trị mà còn bởi vị trí thứ tự của hàng. Hãy nhớ rằng cơ sở dữ liệu quan hệ không có khái niệm về số hàng, chúng chỉ có thứ tự các hàng đối với một số thứ tự bạn phải chỉ định trong ORDER BY
mệnh đề. Đừng nhầm lẫn giữa "id
"pseudokey với số hàng, các con số được chỉ định là tăng đơn điệu chỉ bởi sự trùng hợp của việc triển khai chúng.
Trong MySQL, bạn có thể tận dụng lợi thế của biến do người dùng xác định để đạt được hiệu quả mà bạn đang tìm kiếm. Đặt hàng truy vấn theo clientId
và sau đó là id
và theo dõi các giá trị trên mỗi cột trong biến người dùng MySQL. Khi giá trị trong hàng hiện tại khác với giá trị trong biến, hãy làm bất cứ điều gì đánh dấu bạn định làm. Tôi sẽ đưa ra một ví dụ cho một trường:
SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
IF(@clientid <> clientid,
((@clientid := clientid) AND (@field1 := field1)) = NULL,
IF (@field1 <> field1,
(@field1 := field1),
NULL
)
) AS field1_changed
FROM client c
ORDER BY clientId, id;
Lưu ý rằng giải pháp này không thực sự khác biệt so với việc chỉ chọn tất cả các hàng bằng SQL thuần túy và theo dõi các giá trị bằng các biến ứng dụng khi bạn tìm nạp các hàng.