Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rejoindre à gauche un seul enregistrement aléatoire MySQL

À cause de RAND() votre sous-requête n'est pas déterministe et est donc exécutée pour chaque ligne dans Sponsor table et renvoie à chaque fois un ID aléatoire qui peut correspondre ou non à l'ID de la ligne actuelle. Il est donc non seulement possible qu'aucune ligne ne corresponde à l'ID aléatoire. Il est également possible que plusieurs lignes le soient.

Pour les exemples de données avec deux sponsors, la sous-requête peut renvoyer les valeurs suivantes :

  • (1, 1) correspondra à la première ligne (1=1, 2=1)
  • (1, 2) correspondra aux deux lignes (1=1, 2=2)
  • (2, 1) ne correspondra à aucune ligne (1=2, 2=1)
  • (2, 2) correspondra à la deuxième ligne (1=2, 2=2)

Pour garantir que la sous-requête n'est exécutée qu'une seule fois, vous pouvez l'utiliser avec la clause SELECT. Joignez ensuite le résultat en tant que table dérivée avec le Sponsor tableau :

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

Démo :http://rextester.com/LSSJT25902