AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage über mehrere Tabellen... Wer hat den Durchblick?

Ein Thema von LDericher · begonnen am 12. Aug 2009 · letzter Beitrag vom 13. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

Abfrage über mehrere Tabellen... Wer hat den Durchblick?

  Alt 12. Aug 2009, 12:06
Datenbank: MySQL • Version: 5 • Zugriff über: uMySQLClient.pas ... Was nutzt dat Ding?
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

Euer LDer
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Willmar.Heinrich

Registriert seit: 20. Apr 2009
Ort: Erfurt
38 Beiträge
 
Delphi 2007 Enterprise
 
#2

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

  Alt 12. Aug 2009, 12:11
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!
Willmar
Viele Grüße, Willmar
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 12. Aug 2009, 12:12
Ist als einfacher Join möglich
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 12. Aug 2009, 12:22
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 12. Aug 2009, 12:44
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

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='EnglischAND
  B.Sprache='DeutschAND
  C.Sprache='Französisch'
Fallt rihig drüber her und zerfleischt sie, is sowieso nix wert.
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
110 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 12. Aug 2009, 12:51
Unglaublich.
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 12. Aug 2009, 12:59
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 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.
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 12. Aug 2009, 12:59
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 12. Aug 2009, 13:04
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

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
Ne, im Ernst! Es ist doch (noch) nichts schlimmes passiert.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 12. Aug 2009, 13:05
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
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 ) 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
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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