Wegen RAND()
Ihre Unterabfrage ist nicht deterministisch und wird daher für jede Zeile in Sponsor
ausgeführt Tabelle und gibt jedes Mal eine zufällige ID zurück, die mit der ID der aktuellen Zeile übereinstimmen kann oder nicht. Es ist also nicht nur möglich, dass keine Zeile mit der zufälligen ID übereinstimmt. Es ist auch möglich, dass mehrere Zeilen verwendet werden.
Für die Beispieldaten mit zwei Sponsoren kann die Unterabfrage folgende Werte zurückgeben:
- (1, 1) entspricht der ersten Zeile (1=1, 2=1)
- (1, 2) stimmt mit beiden Zeilen überein (1=1, 2=2)
- (2, 1) passt zu keiner Zeile (1=2, 2=1)
- (2, 2) entspricht der zweiten Zeile (1=2, 2=2)
Um sicherzustellen, dass die Unterabfrage nur einmal ausgeführt wird, können Sie die SELECT-Klausel verwenden. Verbinden Sie dann das Ergebnis als abgeleitete Tabelle mit dem Sponsor
Tabelle:
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
Demo:http://rextester.com/LSSJT25902