• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

MySQL Gurus aufgepasst!

Mitglied seit
01.07.2000
Beiträge
1.062
Reaktionen
0
Folgenes Problem :
Tabelle "Ist" mit 2 Spalten.
ID und Object_ID
Tablle "Soll" mit 2 Spalten.
ID und VBELN.
Ich will nun eine Abfrage haben die alle Einträge anzeigt, die in "Soll" vorhanden sind aber nicht in "Ist". Subqueries kann ich nicht verwenden weil ich eine alte MySQL Version haben.
Die Lösung müsste also irgendwie mit Joins zu realisieren sein.
Hab leider keinen Plan. HELP :(
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
wann sind zwei einträge in beiden tabellen enthalten? wenn die id in beiden vorhanden ist?
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
ka ob das bei mysql geht, aber ich würde es so machen:

SELECT A.ID, A.OBJECT_ID
FROM SOLL A LEFT JOIN IST B ON A.VBELN = B.OBJECT_ID
WHERE B.OBJECT_ID IS NULL
 
Mitglied seit
12.01.2004
Beiträge
8.557
Reaktionen
0
Ort
Gießem
SELECT * /*bzw das was du haben willst */ FROM Ist, Soll WHERE Ist.Object_id = Soll.VBELN

so ausm gedächtnis heraus

amrios sollte auch funktionieren
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
vor allem sollte er schneller sein bei großen tabellen :o
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
Re: Re: MySQL Gurus aufgepasst!

Original geschrieben von Picard)STF
SELECT * /*bzw das was du haben willst */ FROM Ist, Soll WHERE Ist.Object_id = Soll.VBELN

so ausm gedächtnis heraus

amrios sollte auch funktionieren

deinst sucht doch einfach alle einträge die bei beiden da sind raus -.-

aMrios ding sollte wohl passen
 

Sas~iN~LoVe

Guest
Re: Re: MySQL Gurus aufgepasst!

Original geschrieben von Picard)STF
SELECT * /*bzw das was du haben willst */ FROM Ist, Soll WHERE Ist.Object_id = Soll.VBELN

so ausm gedächtnis heraus

amrios sollte auch funktionieren
Das lieftert aber die Einträge, die in beiden Tabellen vorkommen.

Das von aMrio geht natürlich nur, wenn Ist.ID NOT NULL ist, was der Spaltenname aber ja nahe legt. In diesem Fall sollte es also gehen, ne allgemein gültige Lösung ist es nicht.

Edit: OK, das war ja sogar gegeben ^^
 

cart

Technik/Software Forum
Mitglied seit
01.08.2002
Beiträge
4.873
Reaktionen
0
Ort
New York
Btw, da kommt mir grad eine Frage auf, die mir schon lange durch den Kopf geistert, allerdings hatte ich noch nie Probleme damit, von daher habe ich sie noch nicht gestellt.
Wo ist der tatsächliche Unterschied zwischen, JOIN, LEFT JOIN und RIGHT JOIN? Den aus dem Manual kenne ich, aber irgendwie will der nicht so in meinen Kopf.
Btw, "SELECT *" ist unschön, da es langsamer ist, als alles aufzuzählen. Hinzukommt, dass man danach mit relativ langen Arrays àla $foobar['feld_x'] arbeiten muss und nicht gescheit mit $foobar[x] (wobei x eine Zahl ist) rumhantieren kann. Dann zerlegt es nämlich dein Script, wenn du den Table anfasst ;)
 

Disruptor

Turniere & LANs
Mitglied seit
03.08.2002
Beiträge
666
Reaktionen
0
gegeben: tabellen

sitzplatz (id, reihe, platz)
gast (id, name, sitzplatzid)

gesucht: sql-anweisung, die zu einem gast den sitzplatz ausgibt. das kommando soll auch etwas zurück liefern, wenn der user noch keinen sitzplatz reserviert hat.

select g.name, sp.reihe, sp.platz
from gast g
left join sitzplatz sp on g.sitzplatzid = sp.id
where g.name = 'Disruptor'

Disruptor, A, 1

select g.name, sp.reihe, sp.platz
from gast g
left join sitzplatz sp on g.sitzplatzid = sp.id
where g.name = 'cart'

cart, NULL, NULL


Left Join listet hier alle Gäste auf (die freien Sitzplätze fallen weg).

Right Join listet hier alle Sitzplätze auf (Gäste ohne Sitzplatzreservierung fallen weg).

Full Join listet sowohl alle Sitzplätze als auch alle Gäste auf (hier sind dann je nachdem entweder in allen Spalten von g oder sp NULL-Values drin).


Prüfungsfrage:
Was macht folgendes Statement:
select g.name
from gast g
left join sitzplatz sp on g.sitzplatzid = sp.id
where sp.id is null

Anmerkung: Man kann es hier natürlich einfacher schreiben, aber es ist gut zu wissen, dass man ein not exists auch als left join schreiben kann - gerade bei älteren MySQL-Versionen, die keine Subqueries unterstützen.

Der Einsatz von right-join und full-join über mehr als 2 Tabellen führt sehr schnell zur Unleserlichkeit von SQL-Statements.
Einen full-join habe ich in 9 Jahren SQL-Programmierung erst bei 2 Statements benötigt, das eine war eine Benutzerrechteabfrage, wo es zum einen Gruppen- und zum anderen Mitarbeiterrechte gibt.
 
Mitglied seit
01.07.2000
Beiträge
1.062
Reaktionen
0
Hab das von Amrio einfach mal so reingetippt obwohl ichs nicht verstehe.
Kriege folgenden Fehler :
Code:
mysql> select Ist.ID, Ist.object_id from Soll Ist left join Ist Soll on Ist.VBELN = Soll.object_id where Soll.object_id is Null;
ERROR 1054: Unknown column 'Ist.object_id' in 'field list'
Ich versteh auch gar net warum da einmal A.VBELN und einmal A.object_id steht. Falls das A die Tabelle Ist sein soll, dann gibts nur ID und object_id. Die Spalte VBELN hat mit A doch gar nichts zu tun. Genau das gleiche mit B.object_id :confused: :confused:
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
wie gesagt, ich kenne (und mag) mysql nicht, aber wenn DAS die fehlermeldung ist obwohl du meins von weiter oben genau eingetippt hast, dann suckt mysql noch derber als ich immer dachte.

versuchs mal ohne mit "soll as a" und "ist as b" oder lass das mit a und b gleich ganz weg und schreib eben soll.spaltenname etc im select statement.
 

Sas~iN~LoVe

Guest
Code:
from Soll Ist left join Ist Soll on
ist auch Quatsch. Lass mal das erste "Ist" und das zweite "Soll" weg. Trotzdem wenig intuitive Fehlermeldung.

Edit: Außerdem hast du die Spaltennamen vertauscht, oder?
Code:
on Ist.VBELN = Soll.object_id

Deinem allerersten Posting nach isses doch anders rum...
 
Mitglied seit
01.07.2000
Beiträge
1.062
Reaktionen
0
Mh
Hab jetzt
Code:
mysql> select Ist.ID, Ist.object_id from Soll  left join Ist  on Ist.object_id = Soll.VBELN where Ist.object_id is Null;
eingetippt und warte seit 15min auf das Ergebnis. Ich glaub es ist abgekackt. Ich gebs nun auch auf. Hab das heute Mittag bereits mit Access und Excel gelöst. Ist zwar nicht ganz so komfortabel und ich musste M$ Produkte benutzen aber naja...
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
Original geschrieben von cart
Btw, da kommt mir grad eine Frage auf, die mir schon lange durch den Kopf geistert, allerdings hatte ich noch nie Probleme damit, von daher habe ich sie noch nicht gestellt.
Wo ist der tatsächliche Unterschied zwischen, JOIN, LEFT JOIN und RIGHT JOIN? Den aus dem Manual kenne ich, aber irgendwie will der nicht so in meinen Kopf.
Btw, "SELECT *" ist unschön, da es langsamer ist, als alles aufzuzählen. Hinzukommt, dass man danach mit relativ langen Arrays àla $foobar['feld_x'] arbeiten muss und nicht gescheit mit $foobar[x] (wobei x eine Zahl ist) rumhantieren kann. Dann zerlegt es nämlich dein Script, wenn du den Table anfasst ;)

disrupter hat es eigentlich am beispiel schön erklärt - du musst halt möglichst das nehmen, was alle benötigten datensätze enthält. dabei ist ein left oder right join einem full join immer vorzuziehen, da es _viel_ schneller sein kann. gerade wenn du die nicht benötigten sachen später bei WHERE wieder entfernst -.-

zum thread
jo MySQL hat nicht so den besten syntax und auch von umfang her ists etwas beschränkt, aber alias für tabellen werden schon unterstützt:

SELECT a.id FROM tabelle (AS) a

dabie kann das AS sogar weggelassen werden.
 
Oben