Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Mehrere Tabellen auf Eintrag durchsuchen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von SupMap, 9 Januar 2017.

  1. SupMap

    SupMap Benutzer

    Hallo !

    Ich muss mehrere Tabellen (TabelleA, TabelleB, TabelleC, TabelleD) auf einen Eintrag durchsuchen der im Feld "MODELL" den Wert "13" hat und dann den Eintrag mit allen seinen Werten ausgeben. Die Tabellen haben alle verschiedene Felder, bis auf das gemeinsame Feld "MODELL" dessen Werte immer sich nie wiederholen.

    Ich hatte an "SELECT * FROM `TabelleA`, `TabelleB`, `TabelleC`, `TabelleD` where model=13" gedacht aber das scheint nicht zu funktionieren. Hat einer eine Idee ?

    Vielen Dank !

    EDIT: Für das Verständniss, ich habe drei Tabellen die nach einem bestimmten Wert im Feld "MODELL" durchsucht werden müssen. Der Wert ist IMMER nur in einer der Tabellen vorhanden. Sollte der Datensatz mit dem Wert gefunden werden, soll der Datensatz ausgegeben werden also "*"
     
    Zuletzt bearbeitet: 9 Januar 2017
  2. Dukel

    Dukel Datenbank-Guru

    Werden Ähnliche Daten in den Tabellen gespeichert, wenn es überall eine Spalte Modell gibt?
    Wieso dann unterschiedliche Tabellen?
     
  3. SupMap

    SupMap Benutzer

    Hi ! Es sind ähnliche Daten, die jedoch trotzdem getrennt werden müssen. Z.B.: Eine Tabelle für Bügeleisen-Modelle mit den Attributen POWER und TEMPERATUR, eine Tabelle für Waschmaschinen mit den Attributen VOLUMEN und DREHZAHL usw. Alle Tabellen haben jedoch eine unikate Modellnummer, nach der gesucht werden wird
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Dein Geschäft ist zum scheitern verurteilt, weil Du mit der Umprogrammierung nicht mehr nachkommen wirst. Neben Bügeleisen und Waschmaschinen könntest Du auch noch Radiergummi, Kondome und Raumschiffe verkaufen, nur haben die blöderweise alle unterschiedliche Eigenschaften. Du mußt ständig neue Tabellen anlegen und wirst recht schnell kollabieren.

    Schade, gell?
     
  5. SupMap

    SupMap Benutzer

    Abend !

    Vielen Dank für den Tipp, natürlich könnte ich auch vieles andere verkaufen, tuhe ich aber nicht denn die Waschmaschinen und Bügeleisen waren nichts weiter als ein Beispiel und es handelt sich auch nicht um eine Datenbank für einen Onlineshop. Es bleibt bei den 3 Tabellen, kann mir vielleicht jemand eine konstruktive Antwort auf meine Frage geben ? Vielen Dank !
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Wenn Deine Tabellen unterschiedliche Felder haben, kannst das weitestgehend vergessen, bis auf:

    select * from (select 'tabelle1' as table, spalte from table1 union all select 'tabelle2', spalte from table2 union all select 'tabelle3', spalte from table3) foo where spalte = 'das, was Du suchst';

    So nach dem Weg.

    Und ja: das ganze wird Dir, egal was Du vorhast, laut polternd und viel Schmerzen verursachend recht bald auf die Füße fallen. Unabhängig davon, ob Du das jetzt mir glaubst oder nicht. Glaub mir einfach ;-)
     
  7. SupMap

    SupMap Benutzer

    Vielen Dank erst mal für die ausführliche Antwort, kannst du mir eventuell dann eine andere Lösung empfehlen? Wie sollte man ansonsten solche Datensätze aufbauen ?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Die übliche Lösung, die auch mit MySQL geht, nennt sich EAV. Das war die letzten Wochen hier auch schon ab und an Thema.

    Richtig elegant ginge es in PostgreSQL, indem man die Eigenschaften der einzelnen Dinge in einer JSONB-Spalte speichert und z.B. dort auf alle Keys = Modell einen Index legt. Abfragen wären dann absolut trivial - und schnell.
     
  9. SupMap

    SupMap Benutzer

    Werde mich einlesen, vielen Dank !
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Mal als Demo:

    Du hast diese Tabelle (Definition und Daten):

    Code:
    test=*# \d submap
      Table "public.submap"
      Column  |  Type  | Modifiers
    ---------------+---------+-----------
     id  | integer | not null
     produkt  | text  |
     eigenschaften | jsonb  |
    Indexes:
      "submap_pkey" PRIMARY KEY, btree (id)
      "idx_submap" gin (eigenschaften jsonb_path_ops)
    
    test=*# select * from submap ;
     id |  produkt  |  eigenschaften   
    ----+---------------+-----------------------------------------------------------------------------------------------
      1 | Bügeleisen  | {"Farbe": "rot", "Modell": "Holzkohle", "Gewicht": "12kg"}
      2 | Waschmaschine | {"Farbe": "grün", "Modell": "Dampfturbine", "Gewicht": "62kg", "Volumen": "50kg"}
      3 | Raumschiff  | {"Farbe": "silbergrün", "Modell": "Atomreaktor", "Passagiere": "20", "Startmasse": "50000kg"}
    (3 rows)
    
    test=*#
    
    Wir suchen nun alles mit Modell = Holzkohle, ich zeige die einfache Abfrage und das Explain um zu zeigen, daß der Index genutzt wird:

    Code:
    test=*# select * from submap where eigenschaften @> '{"Modell": "Holzkohle"}';
     id |  produkt  |  eigenschaften   
    ----+------------+------------------------------------------------------------
      1 | Bügeleisen | {"Farbe": "rot", "Modell": "Holzkohle", "Gewicht": "12kg"}
    (1 row)
    
    test=*# explain analyse select * from submap where eigenschaften @> '{"Modell": "Holzkohle"}';
      QUERY PLAN   
    -------------------------------------------------------------------------------------------------------------------
     Bitmap Heap Scan on submap  (cost=8.00..12.01 rows=1 width=68) (actual time=0.066..0.069 rows=1 loops=1)
      Recheck Cond: (eigenschaften @> '{"Modell": "Holzkohle"}'::jsonb)
      Heap Blocks: exact=1
      ->  Bitmap Index Scan on idx_submap  (cost=0.00..8.00 rows=1 width=0) (actual time=0.033..0.033 rows=1 loops=1)
      Index Cond: (eigenschaften @> '{"Modell": "Holzkohle"}'::jsonb)
     Planning time: 0.250 ms
     Execution time: 0.176 ms
    (7 rows)
    
    test=*#
    
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Nachtrag: Eigenschaften, die alle Datensätze haben (sollten) sollten natürlich besser in dedizierten Spalten stehen, nur die spezifischen Eigenschaften je Datensatz kann/sollte man in JSONB speichern.
     
  12. SupMap

    SupMap Benutzer

    @akretschmer Vielen vielen Dank für die Erklärung, bin gerade dabei meine PHP-Skripte auf die neue Datenbank umzustellen damit sollten wirklich alle Probleme erledigt sein !
     
    akretschmer gefällt das.
  13. ukulele

    ukulele Datenbank-Guru

    Um das eigentliche Problem nochmal zu eroieren, wie wäre es mit:
    Code:
    SELECT 'tabelle1' AS tabelle,t1.id FROM tabelle t1 WHERE t1.MODELL = 13 UNION ALL
    SELECT 'tabelle2' AS tabelle,t2.id FROM tabelle t2 WHERE t2.MODELL = 13 UNION ALL
    SELECT 'tabelle3' AS tabelle,t3.id FROM tabelle t3 WHERE t3.MODELL = 13 UNION ALL
    SELECT 'tabelle4' AS tabelle,t4.id FROM tabelle t4 WHERE t4.MODELL = 13
    Es können natürlich nur identische Spalten angezeigt werden, der Rest muss anderweitig in eine Textspalte oder ähnliches übegeben werden.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden