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:
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.
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 (...) Viel Spaß bei der Aufgabe :-P Euer LDer |
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Zitat:
|
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Ist als einfacher Join möglich
|
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Zitat:
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. |
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:
Fallt rihig drüber her und zerfleischt sie, is sowieso nix wert.
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' |
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Unglaublich.
|
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
Zitat:
Zitat:
Gruß LDer. |
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 |
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:
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:
Ne, im Ernst! Es ist doch (noch) nichts schlimmes passiert. |
Re: Abfrage über mehrere Tabellen... Wer hat den Durchblick?
SQL-Code:
Okay, DAS habe ich noch nie gesehn, das werd ich gleich ausprobieren, was das macht...
WHERE S.Sprache IN('Deutsch','Spanisch')
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:
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 ;)
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'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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