Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage über mehrere Tabellen... Wer hat den Durchblick? (https://www.delphipraxis.net/138547-abfrage-ueber-mehrere-tabellen-wer-hat-den-durchblick.html)

LDericher 12. Aug 2009 12:06

Datenbank: MySQL • Version: 5 • Zugriff über: uMySQLClient.pas ... Was nutzt dat Ding?

Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Hallo DP!

Ich hoffe mal, dass mein Problem diesmal lösbar ist:

Ich habe eine (extern erreichbare) online-MySQL-Datenbank für ein Projekt.
Darin ist eine Tabelle mit IDs und dazugehörigen Namen sowie eine Tabelle mit (anderen) IDs und Sprachen. Um diese zu verknüpfen, habe ich eine dritte Tabelle mit PersonenIDs und mit SprachenIDs, da ja jeder mehrere Sprachen beherrschen kann.

Jetzt brauche ich dafür eine Abfrage, die mir (am liebsten) zeilenweise die Namen mit allen dazugehörigen Sprachen ausgibt. Also etwa so:

Code:
Tabelle PERSONEN:
PID   Name
1      Adrian
2      Bernd
3      Cäsar
(...)

Tabelle SPRACHEN:
SID   Sprache
1      Deutsch
2      Englisch
3      Französisch
4      Spanisch
(...)

Tabelle PERSONEN_SPRACHEN
PID   SID
1      1
1      4
3      1
3      2
3      3
3      4
(...)
Die Abfrage soll nun zum Beispiel alle Leute auflisten, die Deutsch und Spanisch (oder Englisch und Französisch, oder Englisch und Portugiesisch usw usw.) sprechen können.

Viel Spaß bei der Aufgabe :-P

Euer LDer

Willmar.Heinrich 12. Aug 2009 12:11

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Zitat:

Viel Spaß bei der Aufgabe
...wünsche ich Dir von ganzen Herzen. Wenn Du eine Query hast, mit der Du dann noch nicht klar kommst, kannst Du Dich ja nochmal melden!

mkinzler 12. Aug 2009 12:12

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Ist als einfacher Join möglich

alzaimar 12. Aug 2009 12:22

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Zitat:

Zitat von mkinzler
Ist als einfacher Join möglich

Irgendwo müsste noch ein "AND" rein. Wegen der beiden Sprachen, und weil sie beide sprechen können müssen. Wenn sie nur eine von beiden sprechen könnten müssten, dann wäre ein "OR" angebrachter aber so eben ein "AND".

Ach, ein "ON" muss noch da rein. Und ein SELECT wäre auch praktisch, was meint ihr? Noch die Namen von den Tabellen und ach ein FROM fehlt. Hups, ein paar qualifizierte Feldnamen und vielleicht ein alias. Muss aber nicht.

Fertig.

LDericher 12. Aug 2009 12:44

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Danke für die schnellen Antworten erstmal!

Aber doch:

Ich hab bei euch das Gefühl dass ihr glaubt Ihr hättet einen denkfaulen (sowie vor allem schreibfaulen) Menschen vor euch der keine Lust auf Hausaufgaben hat... genau so hilfreich seid ihr meistens.

Ich habe ja bereits die PERSONEN_SPRACHEN und die Sprachen zu einer VIEW gejoint (hätt ich mir eigentlich auch sparen könne, da ich noch nicht genau weiß, ob die Datenbank oder mein Programm nun die Assoziation übernimmt.

Damit ich dann abfragen kann, wo bei gleicher PersonenID diese UND (AND, ein sehr hilfreiches Wort, in Delphi UND in SQL, ich weiß, denn ich bin NICHT dumm) jene Sprache steht, habe ich meine VIEW nochmal mehrmals mit sich selbst gejoint, damit ich pro Zeile Einen Menschen habe, mit zwei seiner beherrschten Sprachen. Weil ich aber bereits 30 Einträge in der Sprachentabelle habe und ich als Entwickler davon ausgehen muss, dass es bestimmt "Junkies" gibt, die davon alle beherrschen und nach denen man suchen will, müsste ich jetzt diese VIEW nicht nur ein Mal, sondern neunundzwanzig Mal mit sich selbst joinen, um die volle Funktionalität zu behalten. Bei mehr Sprachen entsprechend noch öfter.

Aber, wie ihr jetzt vielleicht ansatzweise verstehen könnt, das will ich nicht. Da entstehen dann Querys, die kein Normalsterblicher mehr warten kann und die bei zB nur einer geforderten Sprache viel zu inperformant sind, als dass diese Möglichkeit für mich ernsthaft in Betracht zu ziehen wäre.

Vielleicht seht ihr jetzt, dass ich mir sehr wohl darüber Gedanken gemacht habe, was ein JOIN ist oder was AND bedeutet. Ich habe sogar schon von SELECT gehört. das war doch so was wie 'gesamte Datenbank unwiderruflich löschen und den Server abschalten und zur Explosion bringen'?
Ja, ich nehme euch das Wort aus dem Mund, bevor ihr überhaupt daran gedacht habt, so eine Dummheit zu schreiben.

Lange Rede, kurzer Sinn: Kommt mir nicht - nie wieder - mit dummen Sprüchen, nur um eure eigene Inkompetenz zu kaschieren.

Weil: Habt ihr schon mal was von temporären Tabellen (auch Unterabfragen genannt) gehört? Davon werd ich gleich mal drei bis fünf bauen, vielleicht auch nur zwei, und die mal miteinander JOINen. Vielleicht bringt mich das der Weltherrschaft ein Stückchen näher.

Ganz dicken lieben Gruß,
Euer LDer.

@Mods/Admins: Wenn ihr mich für diesen Post bannen wollt, tut das ruhig. Blockiert meine IP und am besten meine MAC dazu, bis in alle Ewigkeit. Aber damit zeigt ihr nur, dass ihr genauso wenig auf meiner ... ach, wozu schreibe ich das? Macht doch eh keinen Sinn :spin:

Edit: Meine bisherige Query:
SQL-Code:
SELECT
  A.PersonenID,
  A.Sprache `Sprache1`,
  B.Sprache `Sprache2`,
  C.Sprache `Sprache3`,
  D.Sprache `Sprache4`,
  E.Sprache `Sprache5`,
  F.Sprache `Sprache6`
FROM
  (((((`tji_Sprachen_Personen` A
  INNER JOIN `tji_Sprachen_Personen` B USING(PersonenID))
  INNER JOIN `tji_Sprachen_Personen` C USING(PersonenID))
  INNER JOIN `tji_Sprachen_Personen` D USING(PersonenID))
  INNER JOIN `tji_Sprachen_Personen` E USING(PersonenID))
  INNER JOIN `tji_Sprachen_Personen` F USING(PersonenID))
WHERE
  A.Sprache='Englisch' AND
  B.Sprache='Deutsch' AND
  C.Sprache='Französisch'
Fallt rihig drüber her und zerfleischt sie, is sowieso nix wert.

Zoot 12. Aug 2009 12:51

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Unglaublich.

LDericher 12. Aug 2009 12:59

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Zitat:

Zitat von Zoot
Unglaublich.

Ich fand es bloß "unglaublich", dass ich mich hier behandeln lassen muss wie ein Kleinkind (oder irgendwer der noch nie was von SQL gehört hat):

Zitat:

Zitat von alzaimar
Irgendwo müsste noch ein "AND" rein. Wegen der beiden Sprachen, und weil sie beide sprechen können müssen. Wenn sie nur eine von beiden sprechen könnten müssten, dann wäre ein "OR" angebrachter aber so eben ein "AND".

Ach, ein "ON" muss noch da rein. Und ein SELECT wäre auch praktisch, was meint ihr? Noch die Namen von den Tabellen und ach ein FROM fehlt. Hups, ein paar qualifizierte Feldnamen und vielleicht ein alias. Muss aber nicht.

Also nix gegen euch, sonder nur dagegen, wie ihr manchmal jemanden behandelt, der vielleicht grade nur auf dem Schlauch steht.

Gruß LDer.

DeddyH 12. Aug 2009 12:59

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Versuch es mal so (ohne Gewähr, da einfach nur heruntergetippt):
SQL-Code:
--Personen-Sprachen-Zuordnung ermitteln und zählen
SELECT P.PID, P.Name, COUNT(*) AS Anz_Sprachen
FROM Sprachen S
JOIN Personen_Sprachen PS ON PS.SID = S.SID
JOIN Personen P ON P.PID = PS.PID
--auf 2 Sprachen beschränken
WHERE S.Sprache IN('Deutsch','Spanisch')
--gruppieren und Anzahl auswerten
GROUP BY P.PID, P.Name
HAVING COUNT(*) > 1

Sharky 12. Aug 2009 13:04

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
Bevor hier jetzt ein "Du bist der Böse oder Du bist der Böse-Thread" ensteht möchte ich alle bitten das zu vermeiden :love:

Zitat:

Zitat von Superwinger
... Ich hab bei euch das Gefühl dass ihr glaubt Ihr hättet einen denkfaulen ...

Hai Superwinger,

es wäre sicher hilfreich gewesen wenn Du schon im Eingangsposting gesagt hättest das Du es schon mit einem Join versuchst ;-)
So konnte ja keiner ahnen was Du schon gemacht hast.

Zitat:

@Mods/Admins: Wenn ihr mich für diesen Post bannen wollt, tut das ruhig. Blockiert meine IP und am besten meine MAC dazu, bis in alle Ewigkeit
Wir blockieren eigentlich immer die Hirnschwingungsfrequenzen :stupid:
Ne, im Ernst! Es ist doch (noch) nichts schlimmes passiert.

LDericher 12. Aug 2009 13:05

Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
 
SQL-Code:
WHERE S.Sprache IN('Deutsch','Spanisch')
Okay, DAS habe ich noch nie gesehn, das werd ich gleich ausprobieren, was das macht...

LDer.

Edit: Roter Kasten kam nicht...

Hallo Sharky,

Mit mir kann man ganz normal reden, is kein Problem :D
Ich krieg halt nur manchmal Anfälle vorm PC wenn ich solche Antworten lese...
Diesmal habe ich nun mal einfach drauflosgeschrieben, weil das irgendwann sowieso mal passieren musste...

Und zu deinem Vorschlag, immer alles zu schreiben, was mit dem Problem irgendwie in Verbindung stehen könnte:
Hab ich schon häufiger versucht, is aber meistens darin ausgeartet, dass ich Tipps zu Codeoptimierung bekommen hatte, die ich gar nicht wollte(is ja kein Problem, aber man isst ja keine Pizza wenn man nen Döner will, nur weil Pizza auch lecker is :P) oder dass die wenigsten dann überhaupt noch verstanden haben, was konkret mein Problem ist.

Aber einer Forengemeinde kann man's wohl nie recht machen... Is jetz nich böse gemeint: Wenn man alles um den roten Faden weglässt, wird man für blöd gehalten, weil man den Rest nicht erzählt. Andersrum verwirrt man die Leute zu sehr, wenn man zu viel schreibt... Damit werde ich wohl klarkommen müssen in Zukunft ;)

Gruß LDer.


SQL-Code:
SELECT
  *
FROM
  ((`tji_Sprachen_Personen` A
  INNER JOIN
  (SELECT
    PersonenID,
    Sprache `Sprache2`,
    Bemerkung `Bemerkung2`
  FROM
    `tji_Sprachen_Personen`
  WHERE
    Sprache='Französisch') B
  USING(PersonenID))
  INNER JOIN
  (SELECT
    PersonenID,
    Sprache `Sprache3`,
    Bemerkung `Bemerkung3`
  FROM
    `tji_Sprachen_Personen`
  WHERE
    Sprache='Deutsch') C
  USING(PersonenID))
WHERE
  A.Sprache='Englisch';
Das hab ich mir jetzt gebaut... funktioniert so weit und ich kann so eine Query vom Haupt-Programm individuell generieren lassen... ;) Das nenn ich Performance ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.
Seite 1 von 2  1 2      

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