SQL Statements kombinieren

isset

Grünschnabel
Guten Tag,

ich möchte per PHPMYADMIN den Preis für alle Produkte einer Kategorie mit einer Abfrage ändern.

Preis: 6.8908 = 8,20 €
Kategorie: 69
Das Feld 'products_price' befindet sich in der Tabelle 'products'.

Mit folgendem Statement funktioniert das auslesen per Search einwandfrei:

PHP:
SELECT products.products_id, products_to_categories.products_id, products_to_categories.categories_id, products.products_price
FROM products_to_categories, products, products_description
WHERE products_to_categories.categories_id = 69 AND products_to_categories.products_id = products.products_id

Ergebnis:

http://speedcap.net/sharing/files/a6/54/a6544520bdee7f8765a6d2bb1175f901.png

-------------------------------------------------------------------------------------------------------------------

Nun möchte ich aber per Update den Preis bei jedem dieser Produkte auf 6.8908 setzen.

Hierbei verwende ich Subsearch und kombiniere beide Abfragen:

PHP:
UPDATE products SET products.products_price = 6.8908 WHERE products.products_price IN (SELECT products.products_id, products_to_categories.products_id, products_to_categories.categories_id, products.products_price
FROM products_to_categories, products, products_description
WHERE products_to_categories.categories_id = 69 AND products_to_categories.products_id = products.products_id)

Das führt jedoch leider zu folgendem Fehler:

PHP:
#1241 - Operand should contain 1 column(s)

Zudem werden bereits beim Auslesen die Produkte doppelt bis dreifach gelistet.

Ich hoffe mir kann geholfen werden :)



MfG Isset
 
Wenn du alle Artikel ändern willst die zur Kategorie 69 gehören, dann musst du doch nur dies als Bedingung für die UPDATE-Anweisung machen

SQL:
UPDATE products SET products.products_price = 6.8908 WHERE products.categories = 69
 
So, zuerst mal in eine lesbaer Form bringen: PHP SQL-Statement in PHP lesbar darstellen

SQL:
SELECT 
    products.products_id, 
    products_to_categories.products_id, 
    products_to_categories.categories_id, 
    products.products_price 
FROM 
    products_to_categories, 
    products, 
    products_description 
WHERE 
    products_to_categories.categories_id = 69 
    AND products_to_categories.products_id = products.products_id
SQL:
UPDATE 
    products 
SET 
    products.products_price = 6.8908 
WHERE 
    products.products_price IN (
        SELECT 
            products.products_id, 
            products_to_categories.products_id, 
            products_to_categories.categories_id, 
            products.products_price 
        FROM 
            products_to_categories, 
            products, 
            products_description 
        WHERE 
            products_to_categories.categories_id = 69 
            AND products_to_categories.products_id = products.products_id
    )
Dann sieht man ziemlich genau. Dein Subselect gibt 4 Felder aus. Du vergleichst aber nur mit einem.
Die Description-Tablle interessiert hier gar nicht.
Auch die products hat im Subselect nix verloren

So müsste das aussehen
SQL:
UPDATE 
    products AS prod
SET 
    prod.products_price = 6.8908 
WHERE 
    prod.products_price IN (
        SELECT DISTINCT
            -- hier nur die ID. Der Rest interessiert nicht
            cat.products_id
        FROM 
            products_to_categories AS cat
        WHERE 
            cat.categories_id = 69 
     )
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Antworten, jedoch bin ich derzeit etwas verwirrt!

@tombe: Das würde nicht funktionieren, da Feld 'categories' nicht in der Tabelle 'products' vorhanden ist.

@Yaslaw: Deine Lösung sieht sehr ordentlich aus, jedoch liefert diese kein Ergebnis ("0 Datensätze betroffen.").

EDIT:

Habe die Lösung auf PHP.DE erhalten:

PHP:
UPDATE products AS p 
LEFT JOIN products_to_categories AS c 
ON c.products_id=p.products_id
SET p.products_price = 6.8908
WHERE c.categories_id = 69

Ein großes Dankeschön dennoch an Yaslaw und tombe!
 
Zuletzt bearbeitet:
Moin isset,

Yaslaw hat nur einen Copy&Paste-Fehler drin.

Es sollte bei ihm natürlich "WHERE prod.products_id IN ( subselect)" und nicht "WHERE prod.products_price IN ( subselect)" heissen.

Grüße
Biber
 

Neue Beiträge

Zurück