Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Left Join a Single Random Record MySQL

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