+1 Daumen
566 Aufrufe

Hey Leute,

meine Aufgabe lautet den Vornamen und Nachnamen aller Kunden die das Bild namens 'Mond' gekauft haben in SQL wiederzugeben, wobei das Problem ist, dass Kunde und Bild in zwei seperaten Tabellen auftauchen.

Mein Gedanke war folgender:

SELECT Vorname,Nachname,Name
FROM KUNDE,BILD
WHERE Name = 'Mond'

Wäre das denn so richtig? Wichtig bei dieser Aufgabe ist, dass wir nicht schachteln dürfen. Das Problem bei dieser Ausgabe wäre ja, dass der Name in dem Fall Mond ja auch wiedergegeben wird. Könnte ich name bei Select einfach weglassen und die Bedingung gleich lassen? Die Tabelle von Bild taucht ja trotzdem noch beim From auf.

Wäre auf jeden Fall sehr dankbar für eine Antwort.


Schema:

KÜNSTLER
KünstlerID Vorname Nachname
123456     Manuela   Kant
112233     Johann    Fichte
145678     Eduard    Spinoza

KUNDE
Benutzername Vorname Nachname Email
Bernd        Bernhard Krause    bk@dk.de
B3rnd        Benno     Brause    bb@dk.de
Bernd32      Bernd   Pause     bp@dk.de

BILD
BildID Name Beschreibung Preis Künstler
11    Sonne Die Sonne       50 112233
23     Mond Der Mond       500 145678
29     Sterne Die Sterne     200 112233

ABDRUCK
AbdruckID Größe BildID gekauftVon
100       A3    11      B3rnd
101       A2    29    Bernd32
102       A3    29      B3rnd

Bei Künstler ist die KünstlerId Primärschlüssel.

Bei Bild ist BildID primär und die KünstlerID Fremdschlüsse.

Bei Abdruck ist AbdruckID primär und BildID und gekauft von Fremdschlüsse.

Bei Kunde ist Benutzername Primärschlüssl.

Avatar von

1 Antwort

0 Daumen

Um solch eine Abfrage zu tätigen, benötigst du INNER JOIN.

The INNER JOIN keyword selects records that have matching values in both tables.

blob.png

Wählen wir die Käufer des Bildes "Sterne" mit ID 29, da das Bild "Mond" nicht gekauft wurde (siehe Tabelle Abdruck):

SELECT abdruck.kundenid, kunde.vorname, kunde.nachname FROM `abdruck`
  INNER JOIN `kunde`
    ON abdruck.kundenid = kunde.id
WHERE `bildid` = 29  # id29 = Sterne

Sqlfiddle: http://sqlfiddle.com/#!9/28dc34/4

Ausgabe:
kundenid
vornamenachname
2BennoBrause
3BerndPause


Wichtig: Bei gekauftVon (bzw. kundenid) auf keinen Fall den Benutzernamen, sondern die Kundenid angeben. Der Benutzername kann sich jederzeit ändern.

Hier ist das verbesserte Schema.

1. Tabellennamen und Feldnamen klein schreiben
2. Keine Umlaute
3. IDs

CREATE table `kunstler` (
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(255) NOT NULL,
nachname VARCHAR(255) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `kunstler` (id, vorname, nachname)
VALUES
(123456, "Manuela", "Kant"),
(112233, "Johann", "Fichte"),
(145678, "Eduard", "Spinoza");

CREATE table `kunde` (
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
benutzername VARCHAR(255) NOT NULL,
vorname VARCHAR(255) NOT NULL,
nachname VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `kunde` (id, benutzername, vorname, nachname, email)
VALUES
(1, "Bernd", "Bernhard", "Krause", "bk@dk.de"),
(2, "B3rnd", "Benno", "Brause", "bb@dk.de"),
(3, "Bernd32", "Bernd", "Pause", "bp@dk.de");

CREATE table `bild` (
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) DEFAULT NULL,
beschreibung VARCHAR(255) DEFAULT NULL,
preis decimal(10,2) DEFAULT NULL,
kunstlerid int(10) DEFAULT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `bild` (id, name, beschreibung, preis, kunstlerid)
VALUES
(11, "Sonne", "Die Sonne", 50, 112233),
(23, "Mond", "Der Mond", 500, 145678),
(29, "Sterne", "Die Sterne", 200, 112233);

CREATE table `abdruck` (
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
grosse VARCHAR(20) NOT NULL,
bildid int(10) NOT NULL,
kundenid int(10) NOT NULL
);

INSERT INTO `abdruck` (id, grosse, bildid, kundenid)
VALUES
(100, "A3", 11, 1), #id1 = B3rnd
(101, "A2", 29, 3),    #id2 = Bernd32
(102, "A3", 29, 2);    # id3 = B3rnd

Hoffe, das beantwortet die Fragen.

Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community