Vì RAND()
truy vấn con của bạn không mang tính xác định và do đó được thực thi cho mọi hàng trong Sponsor
bảng và mỗi lần kiểm tra lại một ID ngẫu nhiên có thể khớp hoặc không khớp với ID của hàng hiện tại. Vì vậy, không chỉ có thể mà không có hàng nào khớp với ID ngẫu nhiên. Cũng có thể có nhiều hàng.
Đối với dữ liệu mẫu có hai nhà tài trợ, truy vấn con có thể trả về các giá trị sau:
- (1, 1) sẽ khớp với hàng đầu tiên (1 =1, 2 =1)
- (1, 2) sẽ khớp với cả hai hàng (1 =1, 2 =2)
- (2, 1) sẽ không khớp với hàng (1 =2, 2 =1)
- (2, 2) sẽ khớp với hàng thứ hai (1 =2, 2 =2)
Để đảm bảo rằng truy vấn con chỉ được thực thi một lần, bạn có thể sử dụng mệnh đề SELECT. Sau đó, tham gia kết quả dưới dạng bảng dẫn xuất với Sponsor
bảng:
SELECT C.*, S.Name AS SponName
FROM (
SELECT C.ID AS CompID, C.Name AS CompName, (
SELECT ID FROM Sponsor WHERE Company = C.ID ORDER BY RAND() LIMIT 1
) as SponID
FROM Company C
) C
LEFT JOIN Sponsor S ON S.ID = C.SponID
Bản trình diễn: http://rextester.com/LSSJT25902