Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   mysql-query über mehrere Tabellen, mit Ausnahmen (https://www.delphipraxis.net/49037-mysql-query-ueber-mehrere-tabellen-mit-ausnahmen.html)

yankee 4. Jul 2005 17:17

Datenbank: MySQL • Version: 4 • Zugriff über: PHP

mysql-query über mehrere Tabellen, mit Ausnahmen
 
Es geht um zwei Tabellen. Diese sind bestndteil eines Spiels. Eine Tabelle enthält infos über Spieler und die andere über allianzen (mehrere Spieler können sich zu eine ally zusamennschließen. Mit diesem Query hole ich mir eine Tabelle:
SQL-Code:
SELECT spieler.id,allianzen.id,Nick,allianzen.kurzname,Konstruktionen,Forschungen,Flotte,Spezialisierung,Bemerkungen FROM spieler,allianzen WHERE spieler.allianz=allianzen.id
aber so bekomme ich die Spieler nicht, die in keiner ally sind (spieler.allianz =0).
Jemand 'ne idee, wie ich das umformuliere? Oder wie ich das grundsätzlich lösen kann?

shmia 4. Jul 2005 17:34

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
Du solltest die neuere JOIN-Syntax verwenden:
SQL-Code:
SELECT spieler.id,allianzen.id,Nick,allianzen.kurzname,Konstruktionen,Forschungen,Flotte,Spezialisierung,Bemerkungen
FROM spieler LEFT OUTER JOIN allianzen ON spieler.allianz=allianzen.id
LEFT OUTER JOIN bedeutet: nimm alle Zeilen von Tabelle "spieler" (die steht nämlich links)
und verknüpfe mit Tabelle "allianzen".
Wenn kein passender Datensatz in allianzen gefunden, dann sind alle Felder, die sich auf die rechte Tabelle beziehen = NULL.

yankee 4. Jul 2005 17:37

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
juuuhuuu, das geht!
Danke!
Mal so ganz nebenbei: Das geht aber nur über 2 Tabellen, nicht über mehr, oder?

shmia 4. Jul 2005 17:46

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
Zitat:

Zitat von yankee
Mal so ganz nebenbei: Das geht aber nur über 2 Tabellen, nicht über mehr, oder?

Doch das geht auch über mehrere Tabellen:
SQL-Code:
SELECT TabA.*, TabB.*, TabC.*
FROM (TabA INNER JOIN TabB ON TabA.Feld1=TabB.Feld2) LEFT OUTER JOIN TabC ON TabA.Feld3=TabC.Feld3
Mit der Klammersetzung kannst du die Reihenfolge der JOINs festlegen.
Man darf die Klammern auch weglassen, dann verwendet das DBMS die Reihenfolge, die es am geeignesten hält.
Im Ergebnis macht das keinen Unterschied, nur in der Performance.

yankee 4. Jul 2005 18:43

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
klingt gut. Wo ist denn der Unterschied zwischen INNER JOIN und OUTER JOIN?

titus 4. Jul 2005 18:48

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
Siehe: http://dev.mysql.com/doc/mysql/de/join.html und http://dev.mysql.com/doc/mysql/de/le...imisation.html
Dort sollte es erklärt werden.

mfG

yankee 4. Jul 2005 19:11

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
Zitat:

Zitat von titus

Ich habe es mla versucht:
SQL-Code:
SELECT CONCAT(planeten.x,':',planeten.y,':',planeten.z),CONCAT(CONVERT('[' USING utf8),allianzen.kurzname,CONVERT(']' USING utf8)),spieler.Nick,planeten.Name,planeten.bemerkungen FROM planeten LEFT JOIN spieler ON (planeten.spielerid=spieler.id) LEFT JOIN allianzen ON (spieler.allianz=allianzen.id)
Also ich habe eben die drei Tabellen
planeten, allianzen und spieler.

planeten enthält eine spielerid und
spieler enthält eine allianzid

Und es geht um die Auslistung aller Planeten, inklusiver, welchem Spieler der Planet gehört und welcher Allianz der Spieler angehört.

So, jetzt habe ich das alles geschrieben, um festzustellen, dass ich im oberen query einfach nur eine Tabelle falsch benannt habe *mit-der-hand-vor-den-kopf-hau*
:wall: :wall:

Aber gut, wenn jemand jetzt auchmal joins über mehrerer Tabellen machen will...
Nur den Unterschied zwischen INNER und OUTER und normal JOIN habe ich jetzt immernochnicht verstanden...

marabu 4. Jul 2005 19:43

Re: mysql-query über mehrere Tabellen, mit Ausnahmen
 
Zitat:

Zitat von yankee
Nur den Unterschied zwischen INNER und OUTER und normal JOIN habe ich jetzt immernochnicht verstanden...

Dem kannst du aber durch ein Lesestudium bestimmt abhelfen.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz