MySQL Abfrage über 2 Tabellen

derseso
Goto Top
Hallo,
irgendwie steh ich mächtig auf dem Schlauch (liegts am Montag?).

Ich habe 2 MySQL-Tabellen:
Tab "Produkt" ... | id | name | ...
Tab "Komponenten ... | id | id_produkt | nummer | name | ...

In der Tab "Produkt" stehen die Produkte.
In der Tab "Komponenten" stehen die einzelnen Teile, aus denen ein Produkt besteht.

Jetzt möchte ich alle Produkte angezeigt bekommen, die mindestens aus bestimmten Komponenten/Teilen bestehen.

Bsp.:
- Produkt EINS besteht aus den Teilen mit der "nummer" 123, 456, 789, 134, 188
- Produkt ZWEI besteht aus den Teilen mit der "nummer" 123, 456, 677, 777, 223, 334
- Produkt DREI besteht aus den Teilen mit der "nummer" 123, 456, 781, 134, 333, 431

Ich suche nach den Produkten, die alle mindestens aus den Teilen mit der "nummer" 123, 456 und 134 bestehen.
Somit sollte das Ergebnis die Produkte EINS und DREI sein.

Wie setze ich die MySQL-Abfrage richtig an?
Steh da gerade voll aufm dem Schlauch.

Danke schon mal im Voraus.

Content-Key: 2730153038

Url: https://administrator.de/contentid/2730153038

Ausgedruckt am: 29.06.2022 um 06:06 Uhr

Mitglied: maretz
maretz 09.05.2022 aktualisiert um 13:29:50 Uhr
Goto Top
select x.xyz, y.xyz from tabelle1 as x, tabelle 2 as y where x.id=y.id_produkt

beim "tabelle1 as x" bin ich mir nicht 100% sicher, aber das findet man wirklich in jedem mysql-beispiel...

ps. dann natürlich noch ein "and (x.id=123 or x.id=456 or x.id=134)" ranhängen
Mitglied: derSESO
derSESO 09.05.2022 aktualisiert um 13:34:40 Uhr
Goto Top
"tabelle1 as x" ist soweit korrekt. :) face-smile

Aber, mit der Abfrage bekomme auch die Produkte, wo nur eines der 3 Teile drin ist.
Ich brauche aber nur die Produkte, wo alle 3 Teile drin sind.
Mitglied: gecekusu
gecekusu 09.05.2022 um 13:49:45 Uhr
Goto Top
Zitat von @derSESO:

"tabelle1 as x" ist soweit korrekt. :) face-smile

Aber, mit der Abfrage bekomme auch die Produkte, wo nur eines der 3 Teile drin ist.
Ich brauche aber nur die Produkte, wo alle 3 Teile drin sind.

Wie wäre es mit ein AND statt OR für die Bediengungen?
Bin kein Experte aber ein Versuch schadet nicht:) face-smile
Mitglied: derSESO
derSESO 09.05.2022 um 13:56:29 Uhr
Goto Top
Schon versucht ... da findet er gar nix. :) face-smile

Hab es jetzt mal so gemacht ... zumindest stimmen die Ergebnisse - aber vlt. geht es effektiver.

Mitglied: gecekusu
gecekusu 09.05.2022 um 14:05:04 Uhr
Goto Top
Zitat von @derSESO:

Schon versucht ... da findet er gar nix. :) face-smile

Hab es jetzt mal so gemacht ... zumindest stimmen die Ergebnisse - aber vlt. geht es effektiver.


Habe wieder keine Ahnung aber einfach so gedacht und was geschrieben.

Wie wäre es mit

SELECT DISTINCT P.id
FROM Produkt AS P, Komponenten
WHERE id_produkt = P.id AND (p.nummer = 123 AND p.nummer = 456 AND p.nummer = 134)
Mitglied: derSESO
derSESO 09.05.2022 um 14:09:19 Uhr
Goto Top
Auch schon so versucht ... kein Ergebnis. :) face-smile
Mitglied: akretschmer
akretschmer 09.05.2022 aktualisiert um 14:11:35 Uhr
Goto Top
ich würde es so machen, aber ich habe kein MySQL ...


Mitglied: gecekusu
gecekusu 09.05.2022 um 14:13:27 Uhr
Goto Top
Oder man könnte es auch mit innerjoin versuchen aber wie man es genau macht, weiß ich nicht. Ich bin aber mir sicher, dass es mit innerjoin auch geht:) face-smile
Mitglied: gecekusu
gecekusu 09.05.2022 um 14:20:11 Uhr
Goto Top
Schon wieder einen Vorschlag aber keine Ahnung ob es geht:) face-smile

SELECT distinct P.id FROM Produkt

JOIN Komponenten

ON Komponenten.id_produkt = P.id

WHERE Komponenten.id_produkt = 123 AND Komponenten.id_produkt = 456 AND Komponenten.id_produkt = 134;
Mitglied: akretschmer
akretschmer 09.05.2022 um 14:33:43 Uhr
Goto Top
WHERE Komponenten.id_produkt = 123 AND Komponenten.id_produkt = 456 AND Komponenten.id_produkt = 134;


... wenn man das für 3Cent etwas weiter denkt, dann wäre 123 = 456 = 134. Merkste jetzt selber, oder?
Mitglied: akretschmer
akretschmer 09.05.2022 um 14:56:57 Uhr
Goto Top
Zitat von @akretschmer:

ich würde es so machen, aber ich habe kein MySQL ...

es gäbe noch weitere Wege, aber ich bin mir nicht einmal sicher, ob die Tabellenstruktur richtig normalisiert ist oder ob da Pfusch am Bau betrieben wurde...
Mitglied: gecekusu
gecekusu 09.05.2022 um 15:11:12 Uhr
Goto Top
Zitat von @akretschmer:

WHERE Komponenten.id_produkt = 123 AND Komponenten.id_produkt = 456 AND Komponenten.id_produkt = 134;


... wenn man das für 3Cent etwas weiter denkt, dann wäre 123 = 456 = 134. Merste jetzt selber, oder?

sieht so aus :) face-smile
Mitglied: ukulele-7
ukulele-7 09.05.2022 um 15:48:45 Uhr
Goto Top
Ich hab das mal mit MSSQL gemacht:
Datentabellen habe ich jetzt im WITH-Teil, die können natürlich raus. Für die gesuchte Zusammensetzung habe ich eine Tabelle werteliste genommen, das kann natürlich auch ein Produkt aus der vorhandenen Tabelle sein.
Mitglied: MadMax
MadMax 09.05.2022 um 20:48:27 Uhr
Goto Top
Hallo derSESO,

grundsätzlich liegst Du mit Deiner Abfrage wohl richtig. Bei SQL Server würde es heißen:

Ob es ein "exists" bei MySQL gibt, weiß ich nicht, aber so wie Du die Abfrage formuliert hast, scheint der Effekt derselbe zu sein, wenn Dein Ergebnis stimmt.

Alternative wäre noch:

Gruß, Mad Max
Mitglied: akretschmer
Lösung akretschmer 09.05.2022 um 20:56:12 Uhr
Goto Top
Zitat von @MadMax:

Hallo derSESO,

grundsätzlich liegst Du mit Deiner Abfrage wohl richtig. Bei SQL Server würde es heißen:

Ob es ein "exists" bei MySQL gibt, weiß ich nicht, aber so wie Du die Abfrage formuliert hast, scheint der Effekt derselbe zu sein, wenn Dein Ergebnis stimmt.

Alternative wäre noch:

Gruß, Mad Max

Beide Lösungen sind bei zunehmender Anzahl von zu prüfenden Komponenten zunehmend ###e. Stelle Dir mal die Anzahl im 4-stelligen Bereich vor: tausende EXISTS oder tausende JOIN. Pest oder Cholera?

Oder lieber, als weitere Variante zur schon gezeigten:


Offensichtlich viel einfacher zu erweitern...
Mitglied: MadMax
MadMax 09.05.2022 um 23:52:50 Uhr
Goto Top
exists ist normalerweise recht schnell, vor allem in Verbindung mit einem Index. Da sehe ich das geringere Problem. Die joins sind natürlich so eine Sache ...

Dein erster Vorschlag hatte aber auch ein Problem: ob MySQL die Syntax von PostgreSQL beherrscht ist die Frage.

Dein letzter Vorschlag sieht aber sehr gut aus. Allerdings würde ich empfehlen, "count (distinct nummer)" zu verwenden. Jedenfalls, wenn kein eindeutiger Index auf id_produkt und nummer existiert und MySQL das beherrscht.

Gruß, Mad Max
Mitglied: derSESO
derSESO 10.05.2022 aktualisiert um 07:06:49 Uhr
Goto Top
So, Morgen zusammen.

Erstmal vielen Dank für die Unterstützung.

Kurze Info ... das EXISTS gibt es auch bei MySQL und funktioniert auch bei meinem aufwendigen SQL-Code.

Ich habe jetzt den Vorschlag von @akretschmer (ist als Lösung markiert) umgesetzt.
Funktioniert auch unter MySQL und der Zusammenbau des SQL-Code ist hier doch um einiges simpler als bei meiner Variante. Zumal so auch nur die Tabelle "Komponenten" verwendet wird.

--BED-- ist die Variable, in der die einzelnen Nummern zusammengesetzt sind ('123', '456', ...)
--BEDANZ-- ist die Variable, in der die Anzahl der einzelnen Nummern steht

Noch eine kurze Erklärung zum Sinn ...
Bei den Produkten handelt es sich um Computersysteme und das ganze soll den Kollegen das Finden von möglichen Systemen erleichtern, indem sich das Ergebnis mit jedem Hinzufügen einer Komponente immer weiter einschränkt.
Die Anzahl der Komponenten ist entsprechend auch einigermaßen beschränkt - es werden maximal 2-stellige Komponenten-Anzahlen geprüft.

Nochmals vielen Dank.