moin,
was du willst ist kein OUTER JOIN, schließlich willst du zu jeder plz in der user tabelle einen entsprechenden datensatz aus der geodata tabelle. wenn überhaupt, dann ist das ein INNER JOIN. aber es gibt auch so unterschiede zwischen den beiden abfragen. die erste schränkst du in der where klausel schon ein, in der zweiten abfrage machst du das aber nicht, sondern grenzt nur über das limit ein. dadurch geht er erst mal alle datensätze in der user tabelle durch,selbst wenn du nur zwei datensätze daraus haben willst.
außerdem kann die zweite abfrage gar nicht funktionieren, in der unterabfrage wird nicht sortiert, sprich du nimmst irgend einen datensatz, der größer oder gleich der user.plz ist. du musst es entweder erst sortieren und dann mit limit einschränken oder aber du bentuzt doch die MIN() aggregat-funktion (vielleicht sortiert mysql dort per default, würde mich aber wundern).
aber bevor man eine besserung lösung ermittelt, würdemich erst mal interessieren, ob du diese liste an users vorher schon in der hand oder ob es zufällig ausgewählt werden soll. grundsätzlich macht es nämlich erst mal inn, die tabelle der user datensätze auf die anzahl der user zu begrenzen, die du haben willst, bevor es weiter geht.
Ilja