Abfrage, ob ein Produkt gültig ist
Twilo
- datenbank
0 Vinzenz Mai0 Ilja
0 Ergänzung
Twilo
Hallo,
ich habe mehrere Tabellen
+---------+ +----------------+
| produkt | | produkt_hat_xy |
+---------+ +----------------+
von den produkt_hat_xy gibt es mehrere Tabellen
z.B. Produkt hat Auflagen, Farben, etc.
dann gibt es noch "Option hat Lieferzeit", z.B. eine Auflage von 1000000 ist nicht über Nacht möglich ;)
ich möchte nun abfragen, welches Produkt mindestens eine Option von jeder Option hat (das ist kein Problem), dann muss dazu noch folgendes abgefragt werden
gibt es eine Konstellation, z.b. 1000 Stück mit so und so vielen Farben, Auflagen, etc. mit der gleichen Lieferzeit
z.b. wenn bei ein Produkt 4 von 5 Optionen normal lieferbar sind und die 5 Option nur Express (was eigentlich kein Sinn macht, aber egal ;) ), soll dieses Produkt nicht angezeigt werden
sind alle Optionen z.b. normal, und 4 von 5 per Express lieferbar, soll mir das Produkt angezeigt werden, da alle "normal" haben
kann man diese Abfrage mit einer Abfrage ralisieren, oder muss ich mehrere Abfragen erstellen?
zur Verfügung seht MySQL 4.1
ich hoffe, dass das verständlich war ;-)
mfg
Twilo
Hallo Twilo,
ich möchte nun abfragen, welches Produkt mindestens eine Option von jeder Option hat (das ist kein Problem), dann muss dazu noch folgendes abgefragt werden
gibt es eine Konstellation, z.b. 1000 Stück mit so und so vielen Farben, Auflagen, etc. mit der gleichen Lieferzeit
ohne Beispieltabellen mit Beispielwerten - und dem gewünschten Ergebnis, mit Begründung - kann man Dir bei diesem Problem nicht weiterhelfen.
z.b. wenn bei ein Produkt 4 von 5 Optionen normal lieferbar sind und die 5 Option nur Express (was eigentlich kein Sinn macht, aber egal ;) ), soll dieses Produkt nicht angezeigt werden
sind alle Optionen z.b. normal, und 4 von 5 per Express lieferbar, soll mir das Produkt angezeigt werden, da alle "normal" haben
???
Du hast hier unfreiwillig eine hervorragende Verschleierungstaktik angewandt. Ich habe nicht verstanden, was Du willst. Wie oben gilt:
"ohne Beispieltabellen mit Beispielwerten - und dem
gewünschten Ergebnis, mit Begründung - kann man Dir
bei diesem Problem nicht weiterhelfen."
zur Verfügung seht MySQL 4.1
eine wichtige Information.
ich hoffe, dass das verständlich war ;-)
Nein :-(
Werde konkreter. Bringe konkrete Beispieldaten und konkrete Beispielergebnisse. Du weißt, was in Deinen Tabellen drinsteht, ich nicht - und ich kann es mir auch nicht vorstellen. Beispieldaten sagen mehr als jeder Umschreibungsversuch.
Freundliche Grüße
Vinzenz
yo,
ich will mich Vinz ausführung anschließen, die infos waren leider nicht verständlich genug. auf eines will ich noch hinweisen, schwierigkeiten bei abfragen sind ofmtals das problem von einen nicht so "eleganten" daten-design. deshalb ist es auch immer gut, nicht nur die tabellen anzugeben, die man besitzt, sondern wenn man auch ein wenig die umgebung dazu mit beschreibt. letztlich ist eine datenbank ja nur eine widergabe aller relevanten informationen einer bestimmten umgebung mit ihrem beziehungen zueinander. und wenn wir die umgebung ein wenig kennen, dann hilft uns das wesentlich dabei einschätzen zu können, welche lösung nun die beste ist, bzw. wo wir probleme sehen.
Ilja
Hallo,
es geht um ein Druckportal
es gibt ein Produkt, was mehrere Eigenschaften hat, z.B. Auflage, Farbanzahl, Größe, etc.
Jede dieser Option kann unterschiedliche Lieferzeiten haben, z.B. Option 1000 Stück normal, Express und Overnight, die Option 10000 Stück dagegen nur normal und Express, 100000 Stück dagegen z.B. nur normal, da 100000 Stück est einmal gedruckt werden müssen ;-)
+--------------+ +--------------+ +-----------------------+ +--------------------------+ +----------------+
| t_produkt | | t_Option1 | | t_produkt_has_option1 | | t_option1_has_lieferzeit | | t_lieferzeit |
+--------------+ +--------------+ +-----------------------+ +--------------------------+ +----------------+
| _produkt_id | | _option1_id | | _produkt_id | | _option_id | | _lieferzeit_id |
+--------------+ +--------------+ +-----------------------+ +--------------------------+ +----------------+
| _bezeichnung | | _bezeichnung | | _option1_id | | _lieferzeit_id | | _bezeichnung |
+--------------+ +--------------+ +-----------------------+ +--------------------------+ +----------------+
| _variable1 | | _variable1 | | _standard | | _faktor |
+--------------+ +--------------+ +-----------------------+ +----------------+
| _variable2 | | _variable2 |
+--------------+ +--------------+
| _variablen | | _variablen |
+--------------+ +--------------+
t_Option1 steht für eine Option, die Optionen haben eine unterschiedliche Anzahl von Variablen.
_standard wird benötigt, damit wenn die Seite zum ersten mal geladen wird, der Preis mit den Standardoptionen angezeigt werden kann
der Preis von ein Produkt wird ermittelt anhand von den ganzen Variablen (da steckt eine etwas längere Formel hinter)
herauszufinden, welches Produkt alle Optionen hat, ist kein Problem
mein Problem ist, dass ein Produkt z.B. 4 von 5 Optionen mit folgenden Lieferzeiten haben kann "normal" und "Express", das 5 jedoch entweder keine Lieferzeit, oder z.B. warum auch immer Overnight
bei meiner Berechnung erhalte ich, wenn z.B. alle Optionen als Lieferzeit "normal" und "Express" haben, beide Endpreise, bei Express steht dann noch, um wieviel es teurer gegenüber dem ersten ist
ich möchte verhindern, dass der Kunde ein Produkt zur Auswahl erhält, was sich auf Grund der Optionen nicht bestellen lässt, da z.B. nicht alle die selben Lieferzeiten haben
wenn ich den Preis berechnen lasse, geht die Abfrage über all diese Tabellen, somit habe ich eien Beziehung zwischen t_option1_has_lieferzeit und t_produkt_has_option1, wenn ich allerdings herausfinden möchte, welches Produkt Optionen hat und gleichzeitig müssen diese Optionen mindestens einmal alle die gleiche Lieferzeit haben
da scheiter ich im Moment dran :-(
falls man das nur mit MySQL 5 lösen kann, stellt sich mir die Frage, ob man MySQL 5 ohne Probleme parallel zu MySQL 4.1 installieren kann?
mfg
Twilo
yo,
mein Problem ist, dass ein Produkt z.B. 4 von 5 Optionen mit folgenden Lieferzeiten haben kann "normal" und "Express", das 5 jedoch entweder keine Lieferzeit, oder z.B. warum auch immer Overnight
hört sich erst mal nach einer feststellung an und weniger nach einen problem.
ich möchte verhindern, dass der Kunde ein Produkt zur Auswahl erhält, was sich auf Grund der Optionen nicht bestellen lässt, da z.B. nicht alle die selben Lieferzeiten haben
da muss ich noch mal nachfragen. schließlich ist es möglich, eine option mit overnight und eine option mit normal zu verbinden, indem man einfach die längste lieferzeit nimmt, hier also normal. ich denke aber mal, du wirst die lieferzeit für die option dann mehrfach gespeichert haben, indem du overnight, express und normal für eine option speicherst und deswegen überprüfen, ob die lieferzeiten alle gleich sind. ist in meinen augen dann nicht so gelungen, ehrlich gesagt, könnte ich mir gut vorstellen, dass das daten-design eventuell sich verbessern ließe.
aber zurück zu deinem problem. da du mehrere tabellen hast, wirst du für ein produkt und seine entsprechenden option, bzw. lieferzeiten mehrere datensätze geliefert bekommen, wenn du eine abfrage machst. der produktname der datensätze gleicht sich immer, nur in den optionen und lieferzeiten unterscheiden sich die jeweiligen datensätze dann.
da du nur drei unterschiedliche lieferzeiten hast, wäre eine denkbare lösung wäre, indem du in deine abfrage eine bedingung hinzu nimmst, um alle anderen bis auf eine lieferzeit auszuschließen:
WHERE t_lieferzeit = "normal"
dann solltest du nur noch datensätze mit lieferzeiten "normal" bekommen. der rest ist einfach, noch zwei weitere abfragen der gleichen art mit "express" und "overnight" für die bedingung und alle drei abfragen verbindest du mit dem UNION Operator. schau mal, ob das hilft.
Ilja
Hallo,
mein Problem ist, dass ein Produkt z.B. 4 von 5 Optionen mit folgenden Lieferzeiten haben kann "normal" und "Express", das 5 jedoch entweder keine Lieferzeit, oder z.B. warum auch immer Overnight
hört sich erst mal nach einer feststellung an und weniger nach einen problem.
ich möchte verhindern, dass der Kunde ein Produkt zur Auswahl erhält, was sich auf Grund der Optionen nicht bestellen lässt, da z.B. nicht alle die selben Lieferzeiten haben
da muss ich noch mal nachfragen. schließlich ist es möglich, eine option mit overnight und eine option mit normal zu verbinden, indem man einfach die längste lieferzeit nimmt, hier also normal. ich denke aber mal, du wirst die lieferzeit für die option dann mehrfach gespeichert haben, indem du overnight, express und normal für eine option speicherst und deswegen überprüfen, ob die lieferzeiten alle gleich sind.
dafür ist ja die eine Tabelle zwischentabelle t_lieferzeit_has_option1, etc.
ist in meinen augen dann nicht so gelungen, ehrlich gesagt, könnte ich mir gut vorstellen, dass das daten-design eventuell sich verbessern ließe.
wie kann man das sonst lösen?
dass man das Datendesign verbessern kann, möchte ich nicht in abrede stellen, im Moment fällt mir leider keine bessere Lösung ein
aber zurück zu deinem problem. da du mehrere tabellen hast, wirst du für ein produkt und seine entsprechenden option, bzw. lieferzeiten mehrere datensätze geliefert bekommen, wenn du eine abfrage machst. der produktname der datensätze gleicht sich immer, nur in den optionen und lieferzeiten unterscheiden sich die jeweiligen datensätze dann.
da du nur drei unterschiedliche lieferzeiten hast, wäre eine denkbare lösung wäre, indem du in deine abfrage eine bedingung hinzu nimmst, um alle anderen bis auf eine lieferzeit auszuschließen:
WHERE t_lieferzeit = "normal"
das Problem ist, dass man Lieferzeiten hinzufügen kann bzw. löschen kann, es müssen auch nicht unbedingt 3 bleiben, bei der Anzahl gibt es keine Grenze
dann solltest du nur noch datensätze mit lieferzeiten "normal" bekommen. der rest ist einfach, noch zwei weitere abfragen der gleichen art mit "express" und "overnight" für die bedingung und alle drei abfragen verbindest du mit dem UNION Operator. schau mal, ob das hilft.
dann könte ich z.b. auch vorher die ID's von den Lieferzeiten abfragen, und mir daraus dann den SQL Befehl zusammen bauen
ich werde das nachher gleich mal testen :-)
mfg
Twilo
yo,
ist in meinen augen dann nicht so gelungen, ehrlich gesagt, könnte ich mir gut vorstellen, dass das daten-design eventuell sich verbessern ließe.
wie kann man das sonst lösen?
dass man das Datendesign verbessern kann, möchte ich nicht in abrede stellen, im Moment fällt mir leider keine bessere Lösung ein
es sind auch nur vermutungen von mir. aus der ferne ist es immer schwierig zu beurteilen. es kann sehr gute gründe geben, dass dein design genau so sein sollte, wie du es gemacht hast. allerdings sind mir ein paar stichpunkte aufgefallen. eine sache wäre zum beispiel, dass ich bei den lieferzeiten nur die schnellste lieferzeit speichern würde. ich speichere bei einem auto auch nur die höchstgeschwindigkeit und nicht alle möglichen geschwindigkeiten.
aber zurück zu deinen problem. beim ersten ansatz bin ich davon ausgegangen, dass overnight, express und normal so ziemlich die einzigen unterschiedlichen lieferzeiten sind. wenn man nun noch andere hinzufügen kann, sollte man es anders lösen.
im grunde genommen willst du ja keine datensätze (optionen) ausschließen, sondern nur richtig zuordnen. das sollte sich eigentlich recht einfach über eine sortierung der datensätze lösen lassen. dann hast du alle gleichen lieferzeiten der verschiedenen optionen untereinander. den rest macht die programm-logik, die sich "merkt", wann sich die lieferzeit beim abrufen der einzelnen datensätze verändert. das sollte eigentlich dein problem lösen. der UNION ansatz hat im grunde nichts anderes gemacht.
Ilja
yo,
noch eine ergänzung. wenn du wirklich alle möglichen Optionen mit gleichen lieferzeiten eines produktes in einem datensatz haben willst, dann geht das unter mysql auch mit einer sehr schönen aggregat funktion, nämlich GROUP_CONCAT. dann musst du nur noch vorhger über die lieferzeit gruppieren und diese aggregat-funktion über die optionen anwenden.
vergiss bitte nicht, dass wenn du auch solche spalten wie produktname angeben willst, auch darüber dann gruppieren musst, auch wenn mysql dabei keine fehlermeldung ausgibt.
Ilja
Hallo,
noch eine ergänzung. wenn du wirklich alle möglichen Optionen mit gleichen lieferzeiten eines produktes in einem datensatz haben willst, dann geht das unter mysql auch mit einer sehr schönen aggregat funktion, nämlich GROUP_CONCAT. dann musst du nur noch vorhger über die lieferzeit gruppieren und diese aggregat-funktion über die optionen anwenden.
könntest du ein Beispiel gegen, wie das aussehen müsste?
ich muss mir den englischen Text nachher zu Gemüte ziehen, wenn ich @home bin
vergiss bitte nicht, dass wenn du auch solche spalten wie produktname angeben willst, auch darüber dann gruppieren musst, auch wenn mysql dabei keine fehlermeldung ausgibt.
mir würde reichen, wenn nur die ID's zurückgegeben werden
mfg
Twilo
Hallo,
ist in meinen augen dann nicht so gelungen, ehrlich gesagt, könnte ich mir gut vorstellen, dass das daten-design eventuell sich verbessern ließe.
wie kann man das sonst lösen?
dass man das Datendesign verbessern kann, möchte ich nicht in abrede stellen, im Moment fällt mir leider keine bessere Lösung ein
es sind auch nur vermutungen von mir. aus der ferne ist es immer schwierig zu beurteilen. es kann sehr gute gründe geben, dass dein design genau so sein sollte, wie du es gemacht hast. allerdings sind mir ein paar stichpunkte aufgefallen. eine sache wäre zum beispiel, dass ich bei den lieferzeiten nur die schnellste lieferzeit speichern würde. ich speichere bei einem auto auch nur die höchstgeschwindigkeit und nicht alle möglichen geschwindigkeiten.
der Kunde kann nachher zwischen den möglichen Lieferzeiten auswählen, normal ist z.B. viel günstiger als OverNight
Da OverNight fast doppelt so teuer ist, wird es wohl nicht von jeden Kunden ausgewählt ;-)
wenn er die normalen Optionen auswählt, bekommt er alle Lieferzeiten (aber nur die, wo bei allen Optionen die geliche Lieferzeit eingetragen wurde) + Preisdifferenzen angezeigt, damit er sich für eine Lieferzeit entscheiden kann
das funktioniert schon :-)
aber zurück zu deinen problem. beim ersten ansatz bin ich davon ausgegangen, dass overnight, express und normal so ziemlich die einzigen unterschiedlichen lieferzeiten sind. wenn man nun noch andere hinzufügen kann, sollte man es anders lösen.
im grunde genommen willst du ja keine datensätze (optionen) ausschließen, sondern nur richtig zuordnen. das sollte sich eigentlich recht einfach über eine sortierung der datensätze lösen lassen. dann hast du alle gleichen lieferzeiten der verschiedenen optionen untereinander. den rest macht die programm-logik, die sich "merkt", wann sich die lieferzeit beim abrufen der einzelnen datensätze verändert. das sollte eigentlich dein problem lösen. der UNION ansatz hat im grunde nichts anderes gemacht.
ich möchte schauen, ob ein Produkt, bei allen Optionen, z.b. Auflage, Farben, etc. mindestens einmal die gleiche Lieferzeit vorhanden ist, z.B. "normal"
mfg
Twilo
yo,
ich möchte schauen, ob ein Produkt, bei allen Optionen, z.b. Auflage, Farben, etc. mindestens einmal die gleiche Lieferzeit vorhanden ist, z.B. "normal"
die frage ist, was genau mit "allen optionen" gemeint ist. wir müssen doch noch mal von vorne anfangen. das beste ist, du bringst mal ein paar beispieldaten an, sprich datensätze, die in den tabellen drinne stehen und dann welches ergebnis rauskommen soll, bzw. welche datensätze nicht (mit begründung) selektiert werden sollen.
Ilja
Hallo,
ich möchte schauen, ob ein Produkt, bei allen Optionen, z.b. Auflage, Farben, etc. mindestens einmal die gleiche Lieferzeit vorhanden ist, z.B. "normal"
die frage ist, was genau mit "allen optionen" gemeint ist. wir müssen doch noch mal von vorne anfangen. das beste ist, du bringst mal ein paar beispieldaten an, sprich datensätze, die in den tabellen drinne stehen und dann welches ergebnis rauskommen soll, bzw. welche datensätze nicht (mit begründung) selektiert werden sollen.
ok, wird aber bis heute Abend dauern, da ich dann erst @home bin
soll ich das Beispiel mit allen 5 Optionen machen?
das zu tippen wird dann etwas dauern, da es dann 18 Tabellen sind :-)
oder reicht es, wenn ich es auf 2 Optionen kürze?
mfg
Twilo
yo,
soll ich das Beispiel mit allen 5 Optionen machen?
das zu tippen wird dann etwas dauern, da es dann 18 Tabellen sind :-)
oder reicht es, wenn ich es auf 2 Optionen kürze?
soviel wie nötig, damit es leicht verständlich ist... ;-)
Ilja
Hallo,
soll ich das Beispiel mit allen 5 Optionen machen?
das zu tippen wird dann etwas dauern, da es dann 18 Tabellen sind :-)
oder reicht es, wenn ich es auf 2 Optionen kürze?
soviel wie nötig, damit es leicht verständlich ist... ;-)
so, hab ein sql File erstellt, das hier hinzuzeichnen, war mir etwas zu kompliziert ;-)
das Produkt test1 drüfte jetzt nicht auftauchen, da die Auflage nur die Lieferzeiten 2 und 3 hat, bei den Farben nur 1, bei den anderen Optionen 1 und 2, das Produkt selber hat die IDs 1, 2 und 3 --- die Lieferzeit 1, 2 und 3 taucht bei allen Optionen nicht gleichzeitig auf
beim Produkt test2 taucht die Lieferzeit 1 und 2 bei allen Optionen auf, beim Produkt selber die IDs 1, 2 und 3 --- die IDs 1 und 2 tauchen überall auf
wenn ein Produkt eine Option nicht hat, darf es auch nicht mehr angezeigt werden
ich hoffe, dass es jetzt etwas verständlicher ist :-)
ps. vielleicht hat jemand ja ein Tipp zum Datenbanklayout :)
die Lieferzeiten sollen für ein Produkt und den Optionen separat einsztellbar sein, bei den Farben macht es zwar kein Sinn, soll aber im Moment so umgesetzt werden
ein Produkt kann mehrere Optionen haben
kann man das Datenbanklayout so abändern, dass man eine neue Option, z.B. Falzen, etc. hinzufüghen kann, ohne dass man am Datenbanklayout etwas ändern muss?
Im Moment muss ich für jede weitere Option das Datenbanklayout ändern
mfg
Twilo