PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Knobelaufgabe



Joerg
18-06-2002, 02:06
Hallo,

ich bin noch ein wenig neu in der mySQL Thematik und habe eine Frage.

Ich habe in einer Tabelle zwei Unterschiedliche UserID (eben von 2 Personen), deren Name ich über eine Usertabelle ermitteln möchte. Bekomme ich das in eine sql-anfrage ?

Details

subject message Absenderid empfägerid

blablabla testtest 121212 242424
xxxxxxxx huhuhu 321321 654654

wie kann ich die Namen in einem Schwung ermitteln ??

Vielen Dank !!!

Cyrill
18-06-2002, 08:50
Hi

Du musst mit Foreign Key (Fremdschlüssel) arbeiten. Dieser kannst du beim erstellen der ersten Tabelle der Spalte absenderid und empfängerid zuweisen. Der Fremschlüssel muss dann auf die id der User Tabelle verweisen.

Zur Abfrage:

SELECT name FROM usertabelle WHERE iduser IN (SELECT empfängerid FROM erstetabelle);

So könnte das aussehen!

Cyrill

Joerg
18-06-2002, 11:52
Ich glaube, wir reden von der gleichen Sache.

Tabelle 1
subject message Absenderid empfägerid
blablabla testtest 121212 242424
xxxxxxxx huhuhu 321321 654654

Tabelle 2

Userid Name
121212 Jennifer
242424 Horst
321321 Heinz
654654 Jörg


Die Userid ist der Fremdschlüssel. Ich würde meine Anfrage anfangen...

select
table1.subject
table1.message
table2.name
table2.name
table2.name
from table1
join left table2 on (table1.absenderid = table2.userid and
table1.empfängerid = table2.userid)

aber logischerweise geht die nicht, da die db ja nicht weiß, welche namen sie da eintragen soll. Hier brauche ich Eure Hilfe.

Cyrill
18-06-2002, 12:18
Hi

Versuch es mal mit folgendem SQL Command!

SELECT tabelle1.subject, tabelle1.message,
(SELECT tabelle2.name FROM tabelle2 WHERE tabell2.iduser = tabelle1idempfänger) AS empfängername,
(SELECT tabelle2.name FROM tabelle2 WHERE tabell2.iduser = tabelle1idabsender) AS absendername
FROM tabelle1;


Cyrill

Joerg
18-06-2002, 12:29
oh cool. Ich dachte, Untertabellen gehen bei mysql nicht. Werde es gleich ausprobieren. Durch das AS empfängername kann ich die neue Zelle direkt mit empfängername ansprechen, oder ?


Vielen Dank soweit.

Cyrill
18-06-2002, 12:31
Hi...

mhh ich bin mir nicht mehr ganz sicher ob das mit mysql wirklich geht!
aber ich denke es sollte schong gehen!

Ja sollte eigentlich gehen wenn man es mit AS definiert...!! Und sonst kannst du es ja auch mit der spaltennr angeben!

Cyrill

Joerg
18-06-2002, 12:39
ok, ich check das und geb dann wieder bescheid.

Joerg
18-06-2002, 22:31
leider geht es nicht. Wie es scheint sind in der mysql 4.0 erst die ersten Multitable-Ansätze zu finden. Meine Wünsche hat wohl noch keiner geäußert.

jörg

elrond
19-06-2002, 13:34
die sache ist relativ einfach. Du kannst in einen select eine Tabelle mehrfach einbinden:


(m=mail,ua=user-absender,ue=user-empfänger)

select
m.subject,
m.message,
from table1 m,table2 ua,table2 ue
where m.absenderid=ua.userid
and m.empfängerid =ue.userid

:cool:

ps: deine tabellen heissen aber nicht wirklich table1 und table2 ?!

pps: mysql kann schon lange mit mehreren tabellen gleichzeitig umgehen. Was du eigentlich meintest sind subselects; und die sollte jetzt wohl gehen.

Joerg
19-06-2002, 19:10
meine Tabelle heißen anders. Mein Problem ist auch bei weiten komplizierter. Aber das ist die Kernfrage. Ich werde das gleich mal testen.

Joerg
19-06-2002, 20:02
noch eine Frage. Ich brauche die Verknüpfung über Left Join, also so:

select
m.subject,
m.message,
ua.username as Absendername,
ue.username as Empfaengername
from table1 m
left join table2 ua ON (m.absenderid=ua.userid)
left join table2 ue ON (m.empfängerid =ue.userid)

Aber genau hier meldet die db, das ua.username eine unbekannte Spalte sei.

Habt Ihr hier auch noch mal ein Hinweis ?

elrond
20-06-2002, 09:24
wenn ich table2 so sehe heisst die spalte "name" und nicht "username" :rolleyes:

Joerg
20-06-2002, 13:09
richtig, aber das liegt nur daran, dass wir hier ein beispiel gebaut haben, was ich nicht konsequent weitergeführt habe. Mein original ist in der sicht stimmig.

Trotzdem kann schein MySQL nicht mit Tabellen Alias im Left join umgehen, also zum Beispiel
left join table2 Alias ON (m.absenderid=Alias.userid)

Mache ich da was falsch ?

wwwrun
20-06-2002, 13:45
Hi,
wie siehts so aus?



SELECT a.subject a.message a.empfägerid b.name
FROM tabelle1 a
LEFT JOIN tabelle2 b
ON a.absenderid = b.userid


MfG

Joerg
20-06-2002, 15:49
MySQL meldet:


Unknown column 'b.userid' in 'field list'.

wwwrun
20-06-2002, 16:27
Original geschrieben von Joerg
MySQL meldet:


Unknown column 'b.userid' in 'field list'.

Das SQL statement ist richtig, denn genauso läufts bei mir ja auch :)

entweder hast Du hier "LEFT*JOIN*tabelle2*b" was falsch angegeben
oder hier "ON*a.absenderid*=*b.userid"

MfG
Nico

Joerg
20-06-2002, 18:56
irgendetwas hatte ich da falsch gemacht.

Aber. jetzt geht es !!

thx

wwwrun
20-06-2002, 19:31
:D :D NO PROBLEM :D :D

elrond
21-06-2002, 09:59
glückwunsch:D

buffer_7
13-07-2002, 12:04
Hallo,

Ich hoffe, ich hab das wenigstens teilweise verstanden.
Was kommt raus wenn die Abfrage so aussieht ??

__________________________________________________ ____

SELECT a.subject, a.message, a.empfängerid, b.name, b.userid
FROM tabelle1 a, tabelle2 b
WHERE a.empfängerid = b.userid;

__________________________________________________ _____

Gruß

buffer_7

p.s.: sollte ich was falsch haben, sag was anders sein soll und ich checks nochmal

Joerg
13-07-2002, 14:01
Du bekommst genau die Werte aus tabelle1 und 2, die Deinem Filter a.empfängerid = b.userid entsprechen. Wenn eine empfängerid aus a gar keine passende Userid in b hat, wirst du sie damit nie anzeigen können. Das war mein Ansinnen.


Original geschrieben von buffer_7
Hallo,

Ich hoffe, ich hab das wenigstens teilweise verstanden.
Was kommt raus wenn die Abfrage so aussieht ??

__________________________________________________ ____

SELECT a.subject, a.message, a.empfängerid, b.name, b.userid
FROM tabelle1 a, tabelle2 b
WHERE a.empfängerid = b.userid;

__________________________________________________ _____

Gruß

buffer_7

p.s.: sollte ich was falsch haben, sag was anders sein soll und ich checks nochmal