Hallo Alex,
allgemein ist Deine Abfrage etwas umständlich.
es ist ein typisches Vorgehen von Datenbankanfängern. Aus solchen Fehlern kann man jedoch lernen.
$result = mysql_query("
SELECT
A.Name1, A.ElementsID
FROM
maptab A
WHERE A.TypeID = '$typeid'");
Du musst das A gar nicht benutzen für diese Abfrage
SELECT Name1, ElementsID
FROM maptab
WHERE TypeID = '$typeid'
reicht vollkommen aus
Grundsätzlich spricht nichts dagegen Tabellenaliasnamen zu verwenden. Bei einer Abfrage über eine einzige Tabelle sind sie allerdings in der Tat überflüssig.
für die erweiterte Abfrage:
Die folgende Abfrage sollte genau das darstellen was du hier samt schleife darstellen willst.Mit Fremdschlüssel
$qry = mysql_query=("
SELECT tbl2.NameXY
FROM Tabelle2 AS tbl2, maptab AS A
WHERE tbl2.TypeID = '$typeid'
AND A.Name1 = tbl2.NameXY
");
Nein, diese Abfrage liefert nicht das gleiche wie die Kombination der Abfragen des Fragestellers. Er verlangt die gleiche TypeID in _beiden_ Tabellen. Das ist bei Deiner Abfrage nicht der Fall. Besser daher sauber mit einem INNER JOIN arbeiten:
SELECT
t2.NameXY -- das interessierende Ergebnis
FROM
maptab mt -- vernünftiger Aliasname
INNER JOIN -- die mit
Tabelle2 t2 -- Tabelle2 (Besser auf AS verzichten)
ON
mt.Name1 = t2.NameXY -- über gleiche Namen
AND -- und
mt.TypeID = t2.TypeID -- gleiche TypeID verknüpft ist
WHERE -- wobei nur Datensätze mit
mt.TypeID = <Wert> -- einer bestimmten TypeID interessieren
Oder sicherer als Unterabfrage
$qry = mysql_query=("
SELECT NameXY
FROM Tabelle2
WHERE TypeID = '$typeid'
AND NameXY = (SELECT Name1 FROM maptab WHERE TypeID = '$typeid')
");
Diese Abfrage ist in einer Sache sicherer: Da es TypeID-Werte gibt, für die die Unterabfrage mehr als einen Wert zurückliefert - was ja die Ausgangsfrage des OP ist - wird die Abfrage einfach einen Fehler produzieren und kein Ergebnis. Wenn schon ein Subselect, dann eher so:
SELECT -- Gib mir
NameXY -- die Namen
FROM -- aus
Tabelle2 -- Tabelle2
WHERE -- wobei in der Spalte
TypeID = <wert> -- TypeID nur ein bestimmter Wert vorkommen darf
AND -- und
NameXY IN ( -- Name XY in der Liste
SELECT -- der
Name1 -- Namen
FROM -- aus der Tabelle
maptab -- maptab
WHERE -- mit bestimmten (gleichen) Werten
TypeID = <wert> -- in der Spalte TypeID dieser Tabelle
) -- vorkommt
Es ist leicht ersichtlich, dass das Subselect hier deutlich komplizierter ist. Was die Ausführungsgeschwindigkeit betrifft, so sollte man EXPLAIN befragen.
Möchte der OP jeden Namen nur ein einziges Mal haben, dann böte sich das Schlüsselwort DISTINCT an.
Freundliche Grüße
Vinzenz