A problem you might be having is that you could have many host_data rows for each guest, so you have to use an aggregate function (I used max below) to get to the single row you want to pull a host_id from. I'm more of a SQL Server person, but I think this syntax is pretty close to what you'll use on MySQL. Here's my select:
SELECT g.link_id, ( SELECT MAX(h.host_id) FROM guest_data d INNER JOIN host_data h ON d.guest_nm=hhost_nm GROUP BY h.venue_nm HAVING COUNT(*) = 1 ) AS x FROM guest g WHERE g.guest_id IN ( SELECT d.guest_id FROM guest_data d INNER JOIN host_data h ON d.guest_nm=hhost_nm GROUP BY h.venue_nm HAVING COUNT(*) = 1 )
After checking that the select returns the right result set you can easily convert that into an UPDATE statement:
UPDATE guest g SET link_id= ( SELECT MAX(h.host_id) FROM guest_data d INNER JOIN host_data h ON d.guest_nm=hhost_nm WHERE d.guest_id=g.guest_id GROUP BY h.venue_nm HAVING COUNT(*) = 1 ) WHERE g.guest_id IN ( SELECT d.guest_id FROM guest_data d INNER JOIN host_data h ON d.guest_nm=hhost_nm GROUP BY h.venue_nm HAVING COUNT(*) = 1 )
I hope this is close enough to be of help...