Mysql
 sql >> Database >  >> RDS >> Mysql

A sinistra Unisciti a un singolo record casuale MySQL

A causa di RAND() la tua sottoquery non è deterministica e quindi viene eseguita per ogni riga in Sponsor tabella e ogni volta restituisce un ID casuale che potrebbe corrispondere o meno all'ID della riga corrente. Quindi non solo è possibile che nessuna riga corrisponda all'ID casuale. È anche possibile che lo siano più righe.

Per i dati di esempio con due sponsor, la sottoquery può restituire i seguenti valori:

  • (1, 1) corrisponderà alla prima riga (1=1, 2=1)
  • (1, 2) corrisponderà a entrambe le righe (1=1, 2=2)
  • (2, 1) non corrisponderà a nessuna riga (1=2, 2=1)
  • (2, 2) corrisponderà alla seconda riga (1=2, 2=2)

Per garantire che la sottoquery venga eseguita una sola volta, puoi utilizzarla con la clausola SELECT. Quindi unisci il risultato come tabella derivata con lo Sponsor tabella:

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