Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Benötige SQL Befehl zum ändern von Preisen mit zwei abhängigen Variablen

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Moin

    Da ich auf Grund von Einkaufspreiserhöhungen meine Produktpreise anpassen muss, bitte ich um Hilfe, um nicht alle Preise einzeln ändern zu müssen.

    Ich habe in den einzelnen Kategorien meist viele Produkte von nur wenigen unterschiedlichen Herstellern. Alle Produkte eines Herstellers kosten in dieser Kategorie gleich viel, da sie sich zb. nur in der Farbe unterscheiden.

    Nun würde ich gerne mittels SQL Befehl die Preise innerhalb einer Kategorie nacheinander für jeden Hersteller einzeln anpassen.

    Nettopreis=15€ für Hersteller mit der id=2 wäre kein Problem und würde vermutlich so gehen:
    Code: SQL  [Auswählen]
    UPDATE products SET products_price=15.0000 WHERE manufacturers_id = 2
    Reicht aber nicht, da die Preise in unterschiedlichen Kategorien verschieden sind.

    Jetzt muss ich irgendwie noch die Kategorie da mit in den Befehl bekommen. Ich denke mit einem JOIN auf die Tabelle products_to_categories WHERE categories_id =xy. In beiden Tabellen wäre products_id für das JOIN vorhanden.

    Damit könnte ich dann den Artikelpreis ändern, der bei den Preisoptionen im Backend ganz oben steht. Wie wird dieser dann aber auch in der zweiten Zeile für den Gastpreis geändert? Soll gleich dem Artikelpreis sein. Ich nutze den Gastpreis mit einer Erweiterung von @AGI für alle Kundengruppen, um nicht alle Preise ausfüllen zu müssen.

    Freue mich auf Hilfe.
    Gruss Timm

    Linkback: https://www.modified-shop.org/forum/index.php?topic=41862.0
    Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Hi Timm,

    Ohne jetzt mal die products_to_categories Tabelle im Kopf zu haben.

    Wenn der Hersteller in jeder Kategorie andere Preise hat, wäre es doch wohl auch möglich ohne den JOIN in die genannte Tabelle zu machen, indem du einfach noch an deine Formel
     
    AND products_price = XYZ

    anhängst ...

    Grüße
    Dominik

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Tach Timm,

    mir fehlt es mal wieder an Beispieldatensätzen.

    Damit könnte ich dann den Artikelpreis ändern, der bei den Preisoptionen im Backend ganz oben steht. Wie wird dieser dann aber auch in der zweiten Zeile für den Gastpreis geändert? Soll gleich dem Artikelpreis sein. Ich nutze den Gastpreis mit einer Erweiterung von @AGI für alle Kundengruppen, um nicht alle Preise ausfüllen zu müssen.
    Hat dann bei dir die Tabelle personal_offers_by_customers_status_1   (1 müsste die Kundengruppen-ID von Gast sein) auch Einträge?

    Ich hoffe meine bescheidenen DB Kenntnisse reichen hier. Ich würde es wie folgt versuchen:

    Code: SQL  [Auswählen]
    UPDATE products p
    JOIN products_to_categories  p2c ON p2c.products_id = p.products_id
    SET p.products_price = 15.0000
    WHERE categories_id = 246
    AND p.manufacturers_id = 2
     

    Die Kategorie-ID muss dann halt entsprechend angepasst werden. Sollten die Kategorien IMMER EINDEUTIGE Bezeichnungen haben, könnte man vermutlich mit einem zusätzlichen JOIN auch mit denen arbeiten.

    Sollten in der personal_offers_by_customers_status_1 auch Preise stehen, die DANACH identisch sein sollen, noch:#
    Code: SQL  [Auswählen]
    UPDATE personal_offers_by_customers_status_1 AS po1
    JOIN products AS p ON po1.products_id = p.products_id
    SET po1.personal_offer = p.products_price
    WHERE p.manufacturers_id = 2;

    Das WHERE ist hier nicht zwingend notwendig wenn ALLE Preise mit den Preisen aus der products-Tabelle ersetzt werden sollen.

    WIE IMMER GILT: VON DER DATENBANK VORHER EIN BACKUP ERSTELLEN (Timm, weiß das aber sicher ;) )

    Q

    • Fördermitglied
    • Beiträge: 1.502
    by the way. Wenn Du lieber mit Bruttopreisen arbeiten willst, dann einfach bei dem

    Code: SQL  [Auswählen]
    SET p.products_price = 15.0000

    mit den mathematischen Operatoren arbeiten z.B.
    Code: SQL  [Auswählen]
    SET p.products_price = 17.85 / 1.19

    In diesem Fall wird dann 15.0000 in die Datenbank eingetragen

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Danke Euch beiden.

    Die Variante von oneQ funktioniert einwandfrei. Das erste Statement ändert die Artikelpreise und das zweite die Gastpreise.

    Habe es auch zahlenmäßig geprüft. Ändere ich in einer Kategorie A mit dem ersten Statement 10 Preise, dann in Kategorie B 20 Preise und dann noch in Kategorie C 30 Preise und lasse dann das zweite Statement laufen, dann zeigt er 60 geänderte Werte. Man kann das zweite Statement also sofort nach dem ersten laufen lassen, oder beliebig oft das erste für alle einzelnen gewünschten Kategorien und dann das zweite Statement nur einmal zum Schluss. Kommt halt auf die Zeit an, die man benötigt, weil in der Zeit die Preise nicht für Gäste stimmen würden.

    Großartig, wird mir viel Arbeit in den nächsten Tagen sparen  :thumbs:

    Gruss Timm

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Freut mich, dass es klappt! Danke für die Rückmeldung!  :-B

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Moin

    Ich muss mal wieder Preise für bestimmte Produkte erhöhen. Diesmal haben die Produkte aber keinen Hersteller und es müsste eine Unterscheidung zu anderen Produkten in der Kategorie durch zwei Artikeleigenschaften gemacht werden. Wobei die Kategorie diesmal vermutlich nicht wichtig ist, da die Produkte durch die zwei Artikeleigenschaften genau bestimmt werden können.

    Die zu joinende Tabelle wäre diesmal products_tags worin auch die products_id steht. Und da müsste man dann abfragen ob der Artikel einmal die options_id a mit der values_id b und gleichzeitig die options_id x mit der values_id y hat.

    Kann man das dafür nutzen?

    Code: SQL  [Auswählen]
    UPDATE products p
    JOIN products_to_categories  p2c ON p2c.products_id = p.products_id
    SET p.products_price = 15.0000
    WHERE categories_id = 246
    AND p.manufacturers_id = 2

    Bei einer Artikeleigenschaft würde das vermutlich so aussehen?

    Code: SQL  [Auswählen]
    UPDATE products p
    JOIN products_tags  p2c ON p2c.products_id = p.products_id
    SET p.products_price = 15.0000
    WHERE options_id = a
    AND values_id = b

    Wie bekomme ich da noch die zweite Artikeleigenschaft rein?

    Grüße Timm

    atmiral

    • Neu im Forum
    • Beiträge: 34
    • Geschlecht:
    Hallo Timm,

    Die zu joinende Tabelle wäre diesmal products_tags worin auch die products_id steht. Und da müsste man dann abfragen ob der Artikel einmal die options_id a mit der values_id b und gleichzeitig die options_id x mit der values_id y hat.

    Kann man das dafür nutzen?
    bin nicht sicher ob es mit join geht. Aber so eine Abfrage sollte funktionieren

    Code: SQL  [Auswählen]
    UPDATE products p
    SET p.products_price = 15.0000
    WHERE products_id IN (SELECT DISTINCT `products_id` FROM `products_tags` WHERE `products_id` IN (SELECT DISTINCT `products_id` FROM `products_tags` WHERE `options_id`=a AND `values_id`=b) AND `options_id`=x AND `values_id`=y)
     

    Das sind products die beide Eigenschaften (products_tags) haben.

    Gruß
    Alexander

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Danke dir -probiere ich morgen mal aus.

    Gruß Timm

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Wie bekomme ich da noch die zweite Artikeleigenschaft rein?
    Ich hoffe um die Uhrzeit nicht wieder zu verwirrt zu sein. Im Testshop habe ich keine Artikeleigenschaften, deswegen kann ich das nicht testen.
    Die Version von atmiral klappt vermutlich. Das hier vielleicht auch:
    Code: SQL  [Auswählen]
    UPDATE products p
    SET p.products_price = 15.0000
    WHERE products_id IN
        (SELECT products_id FROM products_tags WHERE values_id = a AND options_id = b
        INTERSECT
        SELECT products_id FROM products_tags WHERE options_id = c AND values_id = d);
     

    *EDIT* Die Version von atmiral ist etwas performanter:
    Code: SQL  [Auswählen]
    UPDATE products p
    SET p.products_price = 15.0000
    WHERE products_id IN (SELECT DISTINCT products_id
                          FROM products_tags
                          WHERE products_id IN (SELECT DISTINCT products_id
                                                  FROM products_tags
                                                  WHERE options_id = a AND values_id = b)
                                 AND options_id = c AND values_id = d);

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Moin

    ich danke euch beiden. Ich habs mit dem SQL Statement von @atmiral probiert, weil du @oneQ auch geschrieben hast, dass dies performanter sei.

    Es funktioniert - Klasse.  :thumbs:

    Aber leider hilft es mir beim jetzigen Problem doch nicht.  :’-(  Sorry, dass ich das vorher nicht noch genauer durchdacht habe.

    Ich hatte gehofft damit meine Knopfpreise upzudaten. Nun hab ich aber von den Einzelknöpfen auch Sets mit 6 Stück. Und diese beiden Produkte haben die gleichen Eigenschaften, durch die ich diese identifiziere fürs SQL Statement.

    Könnte man in der Abfrage noch einfügen, dass der Artikelname entweder nicht "im Set" enthält oder "im Set" enthält? Dann könnte ich das noch unterscheiden und im ersten Durchgang die Einzelknöpfe und im zweiten Durchgang die Sets updaten.

    Grüße Timm

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Nabend Timm,

    jetzt willst es aber wissen?  :-D Dann braucht es noch die products_description und musst dann noch wegen der Sprache aufpassen, falls du mehr als eine hast. Teste mal

    Code: SQL  [Auswählen]
    UPDATE products p
            JOIN products_description pd ON p.products_id = pd.products_id
        SET p.products_price = 33.0000
        WHERE p.products_id IN (SELECT DISTINCT products_id
                                FROM products_tags
                                WHERE products_id IN (SELECT DISTINCT products_id
                                                      FROM products_tags
                                                      WHERE options_id = a AND values_id = b)
                                  AND options_id = c AND values_id = d)
          AND pd.products_name NOT LIKE '%im Set%'  AND language_id = 2;

    bzw. das NOT weglassen, wenn mit 'im Set'.

    *EDIT* in meinem Testshop ist language_id für deutsch die 2. Also ggf. anpassen.

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Ich liebe dieses Form. Funktioniert.

     :king:

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Nur nebenbei:
    [...]
    Die Version von atmiral klappt vermutlich. Das hier vielleicht auch:
    Code: SQL  [Auswählen]
    UPDATE products p
    SET p.products_price = 15.0000
    WHERE products_id IN
        (SELECT products_id FROM products_tags WHERE values_id = a AND options_id = b
        INTERSECT
        SELECT products_id FROM products_tags WHERE options_id = c AND values_id = d);
     
    [...]

    Seit wann gibt es INTERSECT in MySQL ?
    Will sagen, diese erste von dir gepostete Query funktioniert nicht in MySQL.

    Gruß,
    noRiddle

    Q

    • Fördermitglied
    • Beiträge: 1.502
    :mhhh: stimmt. Dann hat das das Programm wohl interpretieren und umbauen können. Ich sollte wirklich nicht mehr nach 22 Uhr an den Computer
    4 Antworten
    2711 Aufrufe
    24. August 2011, 17:03:02 von sicalord
    1 Antworten
    1804 Aufrufe
    06. Mai 2015, 11:46:49 von Nils
    4 Antworten
    3013 Aufrufe
    21. Oktober 2010, 13:32:32 von koshiro
               
    anything