MySQL SELECT mit dem Resultat einer anderen Anfrage
Severin Kacianka
- datenbank
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
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
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
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
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";
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
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
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
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