Twilo: Abfrage, ob ein Produkt gültig ist

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

  1. 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

    1. 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

  2. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

          2. 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

            1. 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

              1. 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

                1. 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

                  1. 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

                    1. Hallo,

                      hab die xml Datei für den DB-Designer4 vergessen ;-)

                      mfg
                      Twilo