Vinzenz Mai: Unterschied SQL Abfrage in PHP und PhpMyADMIN?

Beitrag lesen

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