sql >> Base de Datos >  >> RDS >> Mysql

Izquierda Unirse a un solo registro aleatorio MySQL

Debido a RAND() su subconsulta no es determinista y, por lo tanto, se ejecuta para cada fila en Sponsor table y cada vez devuelve un ID aleatorio que puede coincidir o no con el ID de la fila actual. Por lo tanto, no solo es posible que ninguna fila coincida con la identificación aleatoria. También es posible que varias filas lo hagan.

Para los datos de muestra con dos patrocinadores, la subconsulta puede devolver los siguientes valores:

  • (1, 1) coincidirá con la primera fila (1=1, 2=1)
  • (1, 2) coincidirá con ambas filas (1=1, 2=2)
  • (2, 1) no coincidirá con ninguna fila (1=2, 2=1)
  • (2, 2) coincidirá con la segunda fila (1=2, 2=2)

Para garantizar que la subconsulta se ejecute solo una vez, puede usar la cláusula SELECT. Luego únase al resultado como tabla derivada con el Sponsor tabla:

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

Demostración:http://rextester.com/LSSJT25902