Strahlungsleck: Intersect befehl für MySQL

Hallo,

und zwar gibt es bei PosgreSQL den befehlt intersect um die Schnittmenge
bei abfragen mit mehreren Tabellen zu bekommen. Nur leider gibt es diesen
Befehl bei MySQL nicht.
Könnt ihr mir sagen/helfen wie ich folgendes Problem lösen kann (Habe schon im Internet gegooglet aber verstehe das nicht, da ich auf dem Gebiet neu bin):

autor, buchkrimi, buchdrama und buchscifi

Und ich würde mir gerne jedes Buch der Tabelle ausgeben,
das zwischen 200 und 300 Seiten hat und die Autoren_id =2

die ausgebenden Spalten sollen sein:

  • Seitenanzahl des Buch
  • Name des Buch
  • Name des Autors
  • ID des Autors
  
  
Hier sind die befehle zum Tabellen erzeugen und die Dummy inputs  
Und bitte nicht einfach eine Lösung hin klatschen sondern einfach mal für Neulinge erklärt wie man dieses verwirklichen kann anhand der unten stehenden Daten  
  
CREATE TABLE buchkrimi  
(  
	buch_id int NOT NULL PRIMARY KEY,  
	autor_id int,  
	title VARCHAR ( 255 ) NOT NULL,  
	seiten int  
);  
CREATE TABLE buchdrama  
(  
	buch_id int NOT NULL PRIMARY KEY,  
	autor_id int,  
	title VARCHAR ( 255 ) NOT NULL,  
	seiten int	  
);  
CREATE TABLE buchscifi  
(  
	buch_id int NOT NULL PRIMARY KEY,  
	autor_id int,  
	title VARCHAR ( 255 ) NOT NULL,  
	seiten int  
  
);  
CREATE TABLE Autor  
(  
	autor_id int NOT NULL PRIMARY KEY,  
	autor_name varchar (255),  
	autor_alter int  
);
insert into buchkrimi (autor_id, title,seiten,buch_id) values(1, 'krimi1',134,15);  
insert into buchkrimi (autor_id, title,seiten,buch_id) values(2, 'krimi2',234,11);  
insert into buchkrimi (autor_id, title,seiten,buch_id) values(3, 'krimi3',325,12);  
insert into buchkrimi (autor_id, title,seiten,buch_id) values(1, 'krimi4',123,13);  
insert into buchkrimi (autor_id, title,seiten,buch_id) values(2, 'krimi5',234,14);  
  
  
insert into buchdrama (autor_id, title,seiten,buch_id) values(2, 'drama1',134,15);  
insert into buchdrama (autor_id, title,seiten,buch_id) values(1, 'drama2',234,16);  
insert into buchdrama (autor_id, title,seiten,buch_id) values(3, 'drama3',334,17);  
insert into buchdrama (autor_id, title,seiten,buch_id) values(1, 'drama4',134,18);  
insert into buchdrama (autor_id, title,seiten,buch_id) values(3, 'drama5',234,19);  
  
  
insert into buchscifi (autor_id, title,seiten,buch_id) values(3, 'scifi1',337,20);  
insert into buchscifi (autor_id, title,seiten,buch_id) values(2, 'scifi2',139,21);  
insert into buchscifi (autor_id, title,seiten,buch_id) values(1, 'scifi3',431,22);  
insert into buchscifi (autor_id, title,seiten,buch_id) values(2, 'scifi4',130,23);  
insert into buchscifi (autor_id, title,seiten,buch_id) values(3, 'scifi5',236,24);  
  
insert into autor (autor_id, autor_name,autor_alter) values(1,'autor id 1',10);  
insert into autor (autor_id, autor_name,autor_alter) values(2,'autor id 2',20);  
insert into autor (autor_id, autor_name,autor_alter) values(3,'autor id 3',30);
  1. Hallo,

    Und bitte nicht einfach eine Lösung hin klatschen sondern einfach mal für Neulinge erklärt wie man dieses verwirklichen kann anhand der unten stehenden Daten

    Also eine Lösung auf einem kristallenen Tablett?

    Zu allererst: Deine Datenbankstruktur ist suboptimal. Ein Buch ist ein Buch (im Sinne der Entität) und deshalb brauchts da nur 1 Tabelle "Buch" für. Wenn du eine Unterscheidung willst, dann führe ein Attribut (in Form einer Spalte ein), wo dann z.b. "SciFi" oder "Drama" drin stehen.

    die ausgebenden Spalten sollen sein:

    • Seitenanzahl des Buch
    • Name des Buch
    • Name des Autors
    • ID des Autors

    Also Attribute von mehr als einer Tabelle, das riecht nach einem INNER JOIN von Buch auf Author.

    Wenn du die Tabellenstruktur berichtigst, wirst du bemerken, dass die Lösung ganz ganz simple ist:

    ... WHERE (buch.seiten BETWEEN 200 AND 300) AND (buch.author_id = 2)

    Ciao, Frank

    1. yo,

      Zu allererst: Deine Datenbankstruktur ist suboptimal. Ein Buch ist ein Buch (im Sinne der Entität) und deshalb brauchts da nur 1 Tabelle "Buch" für.

      suboptimal ist relativ, es kommt immer auf den fall drauf an. wenn das dbms keine partitionierung unterstützt (keine ahnung, ob das mysql kann), kann das durch aus ein sinnvoller weg sein.

      Ilja