2009-08-09 10 views
2

Ich habe die folgende Tabelle:INSERT INTO..SELECT..ON DUPLICATE KEYS mehrdeutig ids

mysql> SELECT * FROM `bright_promotion_earnings`; 
+----+----------+------------+----------+-------+ 
| id | promoter | generation | turnover | payed | 
+----+----------+------------+----------+-------+ 
| 1 |  4 |   1 |  10 |  0 | 
| 3 |  4 |   5 |  100 |  0 | 
| 4 |  4 |   3 | 10000 |  1 | 
| 5 |  4 |   3 |  200 |  0 | 
+----+----------+------------+----------+-------+ 
4 rows in set (0.00 sec) 

Es gibt einen eindeutigen Schlüssel (Promotor, Generation, bezahlt):

+---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| bright_promotion_earnings |   0 | promoter_2 |   1 | promoter | A   |   2 |  NULL | NULL | YES | BTREE  |   | 
| bright_promotion_earnings |   0 | promoter_2 |   2 | generation | A   |   4 |  NULL | NULL |  | BTREE  |   | 
| bright_promotion_earnings |   0 | promoter_2 |   3 | payed  | A   |   4 |  NULL | NULL |  | BTREE  |   | 
+---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
3 rows in set (0.00 sec) 

I Now jeden Verdienst für einen Promoter als bezahlt markieren möchten, indem Sie den gleichen Eintrag mit bezahlt = 1 aktualisieren (falls vorhanden).

Also, wenn ich das Ergebnis von Promoter 4 dies als bezahlt markieren wollte, ist, was die Tabelle aussehen soll:

+----+----------+------------+----------+-------+ 
| id | promoter | generation | turnover | payed | 
+----+----------+------------+----------+-------+ 
| 4 |  4 |   3 | 10200 |  1 | 
| 6 |  4 |   5 |  100 |  1 | 
| 7 |  4 |   1 |  10 |  1 | 
+----+----------+------------+----------+-------+ 
3 rows in set (0.00 sec) 

Dies ist mein aktueller Ansatz (ohne die DELETE, die trivial ist):

INSERT INTO 
    bright_promotion_earnings 
    (
     promoter, 
     generation, 
     turnover, 
     payed 
    ) 
SELECT 
    commission.promoter, 
    commission.generation, 
    commission.turnover as turnover2, 
    '1' as payed 
FROM 
    bright_promotion_earnings as commission 
WHERE 
    promoter=4 
    AND payed=0 
ON DUPLICATE KEY UPDATE turnover=turnover+turnover2; 

Aber mysql hält mir den Umsatz zu sagen ist nicht eindeutig:

#1052 - Column 'turnover' in field list is ambiguous 

Hat jemand habe einen Hinweis, da ich die Tabelle, die ich einfüge, nicht als Alias ​​verwenden kann.

Wie kann ich die Tabelle, die ich einfüge, einem Namen geben, damit mysql die Spalte identifizieren kann?

Vielen Dank im Voraus.

Antwort

5

Sie haben ein Umsatzfeld in beiden Tabellen, also kann mysql nicht entscheiden, welchen Sie in der letzten Zeile meinen.

+1

Ja, ich weiß das ... das ist genau mein Problem. Die Frage ist: Wie kann ich der Tabelle geben ich einen Namen einfügen, so dass mysql die Spalte identifizieren kann? –

+7

würde das nicht funktionieren? ON DUPLICATE KEY AKTUALISIERUNG bright_promotion_earnings.turnover = bright_promotion_earnings.turnover + commission.turnover2; – Zed

+0

Ja das hat dir sehr geholfen. –