RAND()
のため サブクエリは決定論的ではないため、Sponsor
のすべての行に対して実行されます テーブルと毎回、現在の行のIDと一致するかどうかに関係なくランダムなIDを再調整します。したがって、ランダムIDに一致する行がない可能性があるだけではありません。複数の行が表示される可能性もあります。
2つのスポンサーを持つサンプルデータの場合、サブクエリは次の値を返す場合があります。
- (1、1)は最初の行(1 =1、2 =1)と一致します
- (1、2)は両方の行に一致します(1 =1、2 =2)
- (2、1)はどの行にも一致しません(1 =2、2 =1)
- (2、2)は2番目の行(1 =2、2 =2)と一致します
サブクエリが1回だけ実行されることを保証するために、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