# SQL Statements kombinieren



## isset (4. Juli 2013)

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:


```
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:


```
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:


```
#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


----------



## tombe (4. Juli 2013)

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


```
UPDATE products SET products.products_price = 6.8908 WHERE products.categories = 69
```


----------



## Yaslaw (4. Juli 2013)

So, zuerst mal in eine lesbaer Form bringen: PHP SQL-Statement in PHP lesbar darstellen


```
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
```


```
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

```
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 
     )
```


----------



## isset (4. Juli 2013)

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:


```
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!*


----------



## Biber3 (5. Juli 2013)

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


----------

