MYSQL optimieren, 3 Tabellen

TS-JC

Erfahrenes Mitglied
Hallo

also kurz der Aufbau meiner Tabellen

1. inselstats_member
Da drin steht u.a. der Name des Spielers, sowie der Index der Allianz
2. ktool_allys
Hier drin stehen alle zugelassenen Allianzen, also wichtig ist der Index der in inselstats_member angesprochen wird
3. ktool_member
Quasi eine Kopie von der 1. Tabelle, wichtig ist hier aber nur der Name

So nun möchte ich aus Tabelle 1 alle Spielernamen haben die 1. einer der Allianzen aus Tabelle 2 angehören und 2. nicht in Tabelle 3 stehen.

Mein Versuch das 1. Problem zu lösen hat geklappt:

PHP:
SELECT inselstats_member.name FROM inselstats_member INNER JOIN ktool_allys ON inselstats_member.ally = ktool_allys.statsid ORDER BY name

Nun habe ich mich an das 2. Problem gemacht, nämlich alle rauszufiltern die schon vorhanden sind in der 3. Tabelle.

PHP:
SELECT inselstats_member.name FROM inselstats_member INNER JOIN ktool_allys ON inselstats_member.ally = ktool_allys.statsid RIGHT JOIN ktool_user ON ktool_user.name <> inselstats_member.name ORDER BY name
Heraus kommt aber das ich alle Namen doppelt drin habe, ausser denen die in der 3. Tabelle sind, die sind nur 1x drin.

Habe verschiedene Möglichkeiten ausprobiert, aber kam immer nur auf dieses Ergebnis.
Hoffe jemand kann mir helfen.
thx4help
 
So könnt's funktionieren:
SQL:
SELECT
  `inselstats_member`.`name`

FROM
            `inselstats_member`
  LEFT JOIN `ktool_allys`       ON `inselstats_member`.`ally` = `ktool_allys`.`statsid`
  LEFT JOIN `ktool_user`        ON `ktool_user.name` = `inselstats_member`.`name`

WHERE
      `ktool_user.name` IS NULL
  AND `ktool_allys`.`statsid` IS NOT NULL

GROUP BY
  `inselstats_member`.`name`

ORDER BY
  `inselstats_member`.`name`
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank hat geklappt.
Allerdings erst nachdem ich noch einige ` eingefügt hatte, z.b. bei WHERE `ktool_user.name` also so: `ktool_user`.`name`
 
Könntest es vielleicht noch kurz erklären?
Das mit den Joins is klar, aber die Where Abfrage raffe ich nicht.

Das Group By is übrigens überflüssig.
 
Durch den LEFT JOIN werden alle Datensätze der linken Tabelle (`inselstats_member`) ausgegeben und jeder dieser Sätze wird mit einem oder mehreren Datensätze aus der rechten Tabelle (`ktool_allys` und `ktool_user`) verknüpft.
Aus der rechten Tabelle sind also nur die Sätze da, die eine Entsprechung in der linken Tabelle haben. Aus der linken Tabelle sind alle Datensätze da, auch wenn sie keine Entsprechung in der gejointen Tabelle haben. In diesem Fall haben alle Felder aus der rechten Tabelle den Wert NULL.
Und diesen Wert kann man mit WHERE abfragen:
SQL:
`ktool_user.name` IS NULL  AND `ktool_allys`.`statsid` IS NOT NULL
heißt also: "Zeige nur die Sätze die keine Entsprechung in `ktool_user.name` haben aber auf jeden Fall eine Entsprechung in `ktool_allys`.

Da ich angenommen habe, dass ein `member` mehrere `allys` haben kann, habe ich das GROUP BY hinzugefügt, da sonst das selbe `member` für jedes seiner `allys` ein mal - inssgesamt also mehrmals - aufgeführt werden würde.
 
Zuletzt bearbeitet von einem Moderator:
Zurück