Problem mit MySQL-Abfrage (Minimal- und Maximalwerte)

Solipso

Grünschnabel
Hallo,

ich bin absoluter mySQL-Neuling und stehe vor einem Problem.

Ich habe bereits eine Abfrage erstellt die aus verschiedenen Tabellen über eine Zuordnungstabelle Kunden und Produkte ausgibt.

Jetzt bestehen noch Parametertabellen zu den einzelnen Produkten und Kundenwünschen. Ich will diese jetzt vergleichen. So haben die Produkte eine Anzahl von Parameternamen mit zugehörigen Minimal- und Maximalwerten. Die Kundenwünsche haben auch Paramaternamen und einen Parameterwert.

Die neue Abfrage soll mir nun die Produkte angeben bei denen der Parameter der Kundenwünsche weder den Minimal- noch den Maximalwert unter- bzw. überschreitet. Produkte können auch Parameter haben die bei Kundenwünschen nicht auftauchen. Nur wenn Kundenwünsche einen Parameter hat soll der die möglichen Produkte einschränken.

Mir schwebt ein "Wenn Parameter-Produkt = Parameter-Kunde Dann Kundenparameter >= ProduktparameterMin Und Kundenparameter <= ProduktparameterMax" vor aber ich weiß nicht wie ich das in eine sql-abfrage bekomme.

Ich hoffe sehr ich konnte die Problemstellung verständlich umschreiben. Ich gehe davon aus dass das ein triviales Problem ist, aber ich bekomme es nicht hin.
 
Nö, ich kann mir mit dieser Beschreibung nichts vorstellen. Was meinst du mit Parametern?
Was ist der Unterschied zwischen 'Parameter-Kunde' und 'Kundenparameter'?

Zeig doch mal grob der Aufbau der Tabelle, dein bisheriges SQL-Statement und ein Datenbeispiel was du haben willst.
Formuliere den Text mir den Feldnamen und nicht mit Umschreibungen.
 
meine Abfrage, die nicht so funktioniert wie ich mir das vorstelle:

select distinct `a1`.`ProduktID` AS `ProduktID`,`a1`.`Bezeichnung` AS `Bezeichnung`,`a1`.`BezeichnungKunde` AS `BezeichnungKunde

from `datenbank`.`abgleichproduktkunde` `a1` join `datenbank`.`kundenwunsch` `a2` join `datenbank`.`produktparameter` `a3` join `datenbank`.`kunde` `a4` join `datenbank`.`produkt` `a5`

where ((`a1`.`ProduktID` = `a5`.`MID`) and (`a1`.`BezeichnungKunde` = `a4`.`Name`) and (`a4`.`FID` = `a2`.`FID`) and (`a5`.`MID` = `a3`.`Produkt_MID`) and (`a2`.`PName` = `a3`.`PName`) and (`a2`.`PWert` >= `a3`.`PWertMin`) and (`a2`.`PWert` <= `a3`.`PWertMax`))



Ein Produkt hätte z.B. die Parameter Farbe, maximale und minimale Höhe, Breite, Tiefe.
Ein Kundenwunsch (aus der Tabelle datenbank.kundenwunsch) wäre z.B. eine Höhe von 10cm und eine Breite von 5cm.
Ich will jetzt, dass mir alle Produkte angezeigt werden die mit den Spezifikationen des Kunden gefertigt werden könnten.
Der Kunde hat jetzt zur Tiefe keine Spezifikation gegeben, diese ist ihm also egal. Also soll hier kein Produkt ausgeschlossen werden
 
Hat niemand eine Idee wie ich das Problem lösen kann?

Bei Unklarheit versuche ich gern das ganze noch irgendwie ausführlicher zu gestalten oder den Code umzuschreiben.
 
So, als erstes habe ich mir mal die Mühe gemacht dein bestehendes SQL so umzuschreiben, dass auch was man es lesen kann, auch wenn man kein SQL-Komplier ist.
SQL:
SELECT DISTINCT
	 apk.ProduktID,
	 apk.Bezeichnung,
	 apk.BezeichnungKunde
FROM 
	abgleichproduktkunde AS apk,
	kundenwunsch AS kw,
	produktparameter AS pp,
	kunde AS k,
	produkt AS p
WHERE
	apk.ProduktID = p.MID
	AND apk.BezeichnungKunde = k.Name
	AND k.FID = kw.FID
	AND p.MID = pp.Produkt_MID
	AND kw.PName = pp.PName
	AND kw.PWert BETWEEN  pp.PWertMin AND pp.PWertMax

Dabei fällt mir der Namensvergleich auf -> nicht schön.

Mit deinen WHERE-Bedinungen: Das Ganze scheint eine Kreisbeziehung zu sein.
k - kw - pp - p - apk - k

So, mehr sehe ich grad auf Anhieb nicht. Deine eigentliche Frage habe ich immer noch nicht verstanden.
Tabellenstruktur, Datenbeispiel (nicht als Satz, sondern als Datenzeilen) und zwar in Ausgangslage und wie die gewünschte Resultat aussehen soll.

Und, ganz wichtig! Ich habe jetzt eine Ausnamhe gemacht. Aber ich lese normalerweise keinen Code der nicht mindestens mit Tabulatoren formatiert in Code-Tags, in diesem Fall noch besser in SQL-Tags geschrieben ist.
 
Zuletzt bearbeitet von einem Moderator:
Ich danke dir sehr für deine Mühe!
So ist das ganze tatsächlich sehr viel übersichtlicher und schneller auffassbar. :)

Ich hab das jetzt eingebaut und ein bisschen rumexperimentiert.

Die letzte Zeile gibt mir noch ein paar Probleme, denn jetzt wird mir kein Produkt mehr ausgegeben obwohl ich die Parameterwerte so verändert habe dass mir eines oder beide angezeigt werden sollten. Ich schaue aber nochmal alles durch, denn eigentlich sollte es damit funktionieren.

Ein Problem was ich sehe ist, wenn im Kundenwunsch mehrere Parameter sind und alle gleichzeitig von einem Produkt erfüllt werden müssen.
So wie ich den Code jetzt verstehe würde er mir aber alle Produkte anzeigen bei denen schon nur einer der Kundenwunschparameter erfüllt wird.

Nachtrag:
Hatte die zündende Idee die Parameterwerte mit anzeigen zu lassen. Es stellt sich heraus dass er mit dem between alles anzeigen müsste, dies aber nicht tut. Bei not between zeigt er alles an, obwohl der Wert klar innerhalb der Grenzen liegt. Nehme ich genau den Wert des Produkts als Kundenwunsch funktioniert es jedoch.

Liegt das Problem daran, dass ich die Felder als varchar deklarieren musste?
Kann das leider nicht ausprobieren, da er mir bei den Produkten "/* SQL Error (1265): Data truncated for column 'PWertMax' at row 1 */" ausgibt wenn ich varchar in int umwandeln will. :(
 
Zuletzt bearbeitet:
Zurück