Datenbank abfrage

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Anfänger33
Beiträge: 25
Registriert: Sa 15. Feb 2025, 13:33

Datenbank abfrage

Beitrag von Anfänger33 »

Vorsicht: Absouter Neuling!

Habe eine Datenbank (mariadb) mit 2 Tabellen (kunden und stadt) angelegt (ext. Server, Zugriff über phpmyadmin). Der Zugriff von Lazarus auf die einzelnen Tabellen klappt (ZConnection, ZTranaction,ZQuery1kunden, DataSourcekunden, ZQuery2stadt, DataSource2stadt). Alle Daten werden in den beiden DBGrids angezeigt.

In der Tabelle kunden habe ich folgende Spalten:
kdid INT(11) AUTO_INCREMENT, PRIMÄR-Schlüssel
nachname VCHAR(30)
vorname VCHAR(30)
stadt INT(11) - Die Städtenamen sollen in einer eigenen Tabelle gepflegt werden.

Tabell stadt:
ortsname VCHAR(30).

In der 3. Tabelle (DBGrid) sollen folgende Spalten angezeigt werden:
kdid, nachname, vorname, ortsname.
ZQuery3 und DataSource3 habe ich angelegt. Im DBGRid3 wird auf ZQuery3 verwiesen. Im dritten DBGrid wird mir keine Spalte ortsname zur Verfügung gestellt.
In der Eigenschaft SQL habe ich "SELECT * FROM kunden" eingetragen. Hier muss sicher was anderes hin.
Eine Änderung in "SELECT kunden.kdid, kunden.nachname, kunden.vorname, kunden.stadt
FROM kunden, stadt
WHERE kunden.stadt = stadt.ortsname" brachte leider nicht das gewünschte Ergebnis.

Was mache ich wenn ich in einer Tabelle 3 oder mehr spalten aus verschiedenen Tabellen benötige?
Leider reichen meine SQL-Kenntnisse nicht aus. In vielen Beispielen wird nur der Zugriff auf eine Tabelle gezeigt,

Anfänger33
Beiträge: 25
Registriert: Sa 15. Feb 2025, 13:33

Re: Datenbank abfrage

Beitrag von Anfänger33 »

Problem mittlerweile selbst gelöst.

Im ZQuery3 muss unter SQL folgende eingetragen werden:
SELECT
kunden.kdid,
kunden.nachname,
kunden.vorname,
stadt.ortsname
FROM
kunden,
stadt
WHERE
kunden.stadt = stadt.idort

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datenbank abfrage

Beitrag von af0815 »

Schau dir mal den Begriff JOIN genauer an. Dabei ist das DB System relativ egal, die Basics kann ein jedes System.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1082
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Datenbank abfrage

Beitrag von charlytango »

Anfänger33 hat geschrieben: So 30. Mär 2025, 15:48 WHERE kunden.stadt = stadt.ortsname
Diese Zeile ist das Problem. Oder besser das dahinterliegende Tabellendesign.

Du vergleichst hier kunden.stadt (das ist lt deinem Design eine integer) mit stadt.Ortsname (das ist ein Varchar(30), also ein String)

Wenn dein Design so aussieht, wird es klappen

Kunden:
kdID INT(11) AUTO_INCREMENT, PRIMÄR-Schlüssel
nachname VCHAR(30)
vorname VCHAR(30)
stadtID INT(11)

stadt:
stadtID INT(11) AUTO_INCREMENT, PRIMÄR-Schlüssel
ortsname VCHAR(30).


Es wird also in die Tabelle Kunden der Primärschlüssel aus der Tabelle stadt eingetragen und deine WHERE Klausel heisst dann

Code: Alles auswählen

WHERE kunden.stadtID = stadt.stadtID
Das Thema bei dem du nachlesen solltest, heisst "Normalisierung"

Antworten