Severin Kacianka: MySQL SELECT mit dem Resultat einer anderen Anfrage

Hallo,

ich weiss nicht, ob ich mich in der Überschrift genau genug ausgedrückt habe, aber das liegt daran, dass ich nicht weiss wie ich mein Problem (und damit meine Suchanfrage) formulieren soll.
Ich arbeite mit MySQL(Version 3 irgendwas) und will folgendes lösen:
Es gibt zwei Tabellen (t1 und t2):
t1 sieht in etwas so aus:
ID | NAME | ...
--------------

t2 sieht in etwa so aus:
ID | Feld1 | Feld2 | etc.

Die IDs sind also bei beiden Tabelle dasselbe.
Wie kann ich nun den Wert von Feld1 für den Namen "test" herausfinden?

Es müsste in etwa so aussehen:
SELECT  FELD1 FROM t2 WHERE ID (SELECT ID FROM t1 WHERE NAME='test')

Das geht so halt leider irgendwie nicht :-(

Gibt es eine Möglichkeit dies nur mit MySQL zu lösen, oder soll ich mir zuerst die zu suchenden IDs ausslesen, sie in PHP zwischenspeichern und dann nach SELECT * FROM t2 WHERE ID = $phpidcontainer[0] OR ID= $phpidcontainer[1] (....) suchen?

Danke für eure Zeit,
Severin

--
They that can give up essential liberty to obtain a little temporary safty deserve neither liberty nor safty.
-- Benjamin Franklin
  1. Hallo Severin,

    Es gibt zwei Tabellen (t1 und t2):
    t1 sieht in etwas so aus:
    ID | NAME | ...

    t2 sieht in etwa so aus:
    ID | Feld1 | Feld2 | etc.

    Die IDs sind also bei beiden Tabelle dasselbe.
    Wie kann ich nun den Wert von Feld1 für den Namen "test" herausfinden?

    Das ist eine Standardaufgabe für SQL. Die Lösung heisst INNER JOIN.

      
    SELECT  
        Feld1  
    FROM t2  
    INNER JOIN t1 ON t2.ID = t1.ID  
    WHERE t1.´NAME´ = 'test'
    

    Es könnte es sich auch um einen OUTER JOIN handeln. Das zu beurteilen, sind Deine Angaben zu dürftig.

    Bitte beachte, dass NAME ein schlechter Feldname ist, da es sich um ein reserviertes Wort handelt. Deswegen ist unter unter MySQL die Quotierung mit Backticks erforderlich. Meine Strategie lautet solche Namen zu vermeiden, da jedes DBMS seine eigenen Quotierungsregeln hat.

    Bitte beachte ferner, dass die Einträge im Feld NAME nicht unbedingt unterschiedlich sein müssen (es sei denn, Du hast einen Index auf diesem Feld der UNIQUE ist). Somit kannst Du zu einem Namen bereits mehrere Einträge in t1 finden, und somit mehrere Einträge in t2.

    Was Du weiterhin nicht erwähnt hast ist die Art der Beziehung zwischen t1 und t2. Es gibt z.B. die 1:1 und die 1:n-Beziehung (die n:m-Beziehung möchte ich hier ausklammern). Kannst Du sicherstellen, dass es zu jedem Eintrag in der Tabelle t1 einen korrespondierenden Eintrag in der Tabelle t2 gibt?

    Weitere Informationen zu JOINs findest Du z.B. in diesem Archivposting.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz und Ilja,

      Vielen Dank euch für die schnelle Hilfe. Jetzt weiss ich endlich ganz genau wonach ich Suchen muss und welche Teile der Dokumentation für mich relevant sind. Ich habe mich bis jetzt noch nie eingehend mit (My)SQL beschäftigt, wollte jetzt dieses Problem möglichst ellegant lösen und konnte einfach keinen (Such)ansatz finden.
      Auf das Desgin der Tabellen habe ich leider keinen Einfluss. Ich habe nur die Wartung des Systems übernommen und bin sehr aprupt ins kalte Wasser gefallen.

      Gruß,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safty deserve neither liberty nor safty.
      -- Benjamin Franklin
  2. yo,

    Es müsste in etwa so aussehen:
    SELECT  FELD1 FROM t2 WHERE ID (SELECT ID FROM t1 WHERE NAME='test')
    Das geht so halt leider irgendwie nicht :-(

    unterabfragen gehen bei mysql erst ab version 4.1 und höher. du schriebst etwas von 3.x insofern verwundert das auch nicht. wie Vinzenz schon sagte, benutzt du dafür einen JOIN beider tabellen, wobei dein daten-desgin zumindestens den eindruck erweckt, ihn noch einmal zu überdenken. aber dazu bräuchte man mehr infos.

    SELECT t1.name, t2.feld
    FROM t1
    LEFT JOIN t2 ON (t1.id = t2.id)
    WHERE t1.name = 'test'

    mysql ist case-sensitive also test <> Test

    Ilja

    1. echo $begrüßung;

      mysql ist case-sensitive also test <> Test

      Ähem, nein. Sowohl meine Erfahrung als auch alle relevanten Handbuchfundstellen zu "case" und "sensitive" sprechen vom Gegenteil. Man benötigt BINARY-Spalten-Werte oder ein vorangestelltes "binary".

      echo "$verabschiedung $name";

      1. yo,

        Ähem, nein. Sowohl meine Erfahrung als auch alle relevanten Handbuchfundstellen zu "case" und "sensitive" sprechen vom Gegenteil. Man benötigt BINARY-Spalten-Werte oder ein vorangestelltes "binary".

        da habe ich dann scheinbar wieder mal den unterschied zwischen mysql und oracle nicht beachtet. vielleicht sollte der schuster bei seinem leisten bleiben. <sigh>

        Ilja

        1. Hallo Ilja,

          da habe ich dann scheinbar wieder mal den unterschied zwischen mysql und oracle nicht beachtet. vielleicht sollte der schuster bei seinem leisten bleiben. <sigh>

          selbst Priester und Seher hatten halt gelegentlich Probleme, ein Orakel richtig zu deuten. MySQL scheint halt noch schwieriger zu sein, siehe die beliebten zufälligen zusätzlichen Spalten bei GROUP BY, das ist schon eher Hellseherei *bg*

          Da Orakel eine höhere Qualität besitzen als Hellseherei übertrage ich dies auf Oracle und MySQL ...

          Freundliche Grüße

          Vinzenz

          1. yo,

            Da Orakel eine höhere Qualität besitzen als Hellseherei übertrage ich dies auf Oracle und MySQL ...

            du meinst GROUP BY, das Oracle von MySQL ?

            Ilja

            1. Hallo Ilja,

              Da Orakel eine höhere Qualität besitzen als Hellseherei übertrage ich dies auf Oracle und MySQL ...

              du meinst GROUP BY, das Oracle von MySQL ?

              ich muss doch bitten. GROUP BY in MySQL ist Hellseherei und Orakel stehen weit über Hellseherei :-) Du wirst Dich doch nicht Deiner Herkunft schämen, schließlich bist Du doch zertifizierter Orakel^H^H^Hcle-Ausleger, nach Wikipedia das personifizierte Oracle^H^H^Hkel, oh verdammt ... *bg*

              Prophetische Grüße

              Vinzenz