Поради RAND()
вашата подзаявка не е детерминистична и следователно се изпълнява за всеки ред в Sponsor
таблица и всеки път връща случаен идентификатор, който може да съвпада или не с идентификатора на текущия ред. Така че не само е възможно нито един ред да не съответства на произволния идентификатор. Възможно е също няколко реда да го направят.
За примерните данни с двама спонсори подзаявката може да върне следните стойности:
- (1, 1) ще съответства на първия ред (1=1, 2=1)
- (1, 2) ще съответства на двата реда (1=1, 2=2)
- (2, 1) няма да съответства на нито един ред (1=2, 2=1)
- (2, 2) ще съответства на втория ред (1=2, 2=2)
За да гарантирате, че подзаявката се изпълнява само веднъж, можете да използвате клаузата SELECT. След това съединете резултата като извлечена таблица с Sponsor
таблица:
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
Демонстрация:http://rextester.com/LSSJT25902