ripley_one Geschrieben 27. Januar 2010 Teilen Geschrieben 27. Januar 2010 Hallo liebes Forum, stehe als blutige Anfängerin vor einem Scherbenhaufen::old Ich habe eine Datenbank mit vielen Tabellen darin. Nun möchte ich eine Spalte (produkt_name) der Tabelle (produkt_beschreibung) um einen Text (Adidas) ergänzen, so dass der produkt_name um das Wort "Adidas" erweitert wird (der übrige Teil des Datensatzes soll erhalten bleiben, nicht überschrieben werden). Das allein wäre nicht unbedingt ein Problem... glaube ich... Jetzt kommt allerdings die WHERE Klausel. Dies soll nämlich nur für alle die Produkte geschehen, die in einer anderen Tabelle (produkte) in der spalte (hersteller_id) den Wert "2" besitzen (die 2 steht in diesem Fall für Adidas). Beide Tabellen besitzen die Spalte produkt_id. Folgende Lösungen habe ich probiert und bin gescheitert: UPDATE produkt_beschreibung, produkte SET produkt_beschreibung.produkt_name = concat("Adidas"," ",produkt_name) WHERE produkt_beschreibung.produkt_id = produkte.produkt_id AND produkte.hersteller_id=2 UPDATE produkt_beschreibung SET produkt_name = concat("Adidas"," ",produkt_name) WHERE produkt_id = (SELECT produkt_id FROM produkte WHERE hersteller_id=2) Irgendwie scheint die Abfrage kein Ergebnis zu liefern... oder aber zu viele. Wie kann ich für ALLE in Frage kommenden Produkte den Namen entsprechend aktualisieren? Bin für jeden Tipp dankbar! Viele Grüße! *rip* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 27. Januar 2010 Teilen Geschrieben 27. Januar 2010 Hallo, also die letzte Abfrage sieht doch gar nicht schlecht aus. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 27. Januar 2010 Teilen Geschrieben 27. Januar 2010 also die letzte Abfrage sieht doch gar nicht schlecht aus. Sieht gut aus, schlägt aber fehl, wenn es mehr als einen Satz für die hersteller_id=2 gibt. Statt = muss es IN heißen: WHERE produkt_id [B]IN[/B] (SELECT produkt_id FROM produkte WHERE hersteller_id=2) Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ripley_one Geschrieben 27. Januar 2010 Autor Teilen Geschrieben 27. Januar 2010 (bearbeitet) Lieben Dank für eure Hilfe. ....Genau das scheint mein Problem zu sein zu viele Datensätze... Leider funktioniert es mit dem Austausch von = durch IN auch nicht. Immernoch "keine Datensätze". Hab gelesen, dass es bei einer INNEREN(?) SELECT Anweisung immer nur einen Datensatz gegen darf, der ausgegeben wird... das is ja bei mir nich der Fall... Bearbeitet 27. Januar 2010 von ripley_one Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ripley_one Geschrieben 27. Januar 2010 Autor Teilen Geschrieben 27. Januar 2010 AHHHHHHHHHH! Kommando: ZURÜCK! Es hat schon 8x geklappt... zum Testen hatte ich den Dumper genutzt und der bemerktr immer "keine Datensätze".. schienbar hatte er aber im Hintergrund den Befehl ordnungsgemäß ausgeführt. Nun hab ich 8x Adidas vor meinen Artikeln stehen. OK! Aber in der der realen Datenbank hab ich den Befehl einmal ausgeführt... Ergebnis: 2603 Zeile(n) betroffen. ( die Abfrage dauerte 1.7498 sek. ) UPDATE xt_products_description SET products_name = concat( "Adidas", " ", products_name ) WHERE products_id IN ( SELECT products_id FROM xt_products WHERE manufacturers_id =2 ) :upps Herzlichen Dank für die Lösung! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 27. Januar 2010 Teilen Geschrieben 27. Januar 2010 Sieht gut aus, schlägt aber fehl, wenn es mehr als einen Satz für die hersteller_id=2 gibt. Statt = muss es IN heißen: WHERE produkt_id [B]IN[/B] (SELECT produkt_id FROM produkte WHERE hersteller_id=2) Richtig. Das Gleichheitszeichen habe ich übersehen. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ripley_one Geschrieben 27. Januar 2010 Autor Teilen Geschrieben 27. Januar 2010 oh scheinbar ging doch etwas schief... dieses script fügt das Wort Adidas nun 8x ein, obwohl ich es nur einmal ausführe... verrückt!:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 28. Januar 2010 Teilen Geschrieben 28. Januar 2010 gibts dort produkt-ids von 2 verschiedenen herstellern? is doch sehr unlogisch sowas oder? denn sonst steh ich grad aufm schlauch was dein problem betrifft. oder haste erst 8X concat und 1x commit? ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ripley_one Geschrieben 28. Januar 2010 Autor Teilen Geschrieben 28. Januar 2010 Produkte haben IDs und Hersteller haben IDs. Adidas hat die ID 2 und beispielsweise K2 hat die ID 14. Was ist daran unlogisch? Ich führe den Befehl einmal! aus (im SQL Fenster bei MySQL) und der Produktname erhält z.B. "Adidas Adidas Adidas Adidas Adidas Adidas Adidas Adidas T-Shirt, Farbe: Blau" als Namen. Es soll doch aber nur einmal eingefügt werden das Wort Adidas... Was sorgt dafür, dass es gleich 8x eingefügt wird? was heißt commit? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 29. Januar 2010 Teilen Geschrieben 29. Januar 2010 SQL arbeitet mengenorientiert. Du bekommst in deinem Subselect eine Menge x von IDs und für jede dieser IDs wird der Updatebefehl einmal in der angegebenen Menge durchlaufen. In deinem Fall eben 8 mal. was heißt commit? Oh je. Ich weiß Du bist Einsteiger in dem Bereich, aber das ist in etwa so, wie wenn ein Führerscheinneuling frägt, was der Tankdeckel ist. Mit Commit schreibst Du die Änderungen die Du gmeacht hast in der Datenbank fest. Das Gegenteil wäre ein Rollback, der die Änderungen wieder auf den vorherigen Stand zurückfährt. Zu Deinem eigentlichen Problem: Du benötigst das, was man eine korrelierte Subquery nennt: UPDATE xt_products_description a SET a.products_name = (select concat( "Adidas", " ", a.products_name ) from xt_products b where a.products_id=b.products_id and b.manufacturers_id =2) WHERE products_id IN ( SELECT products_id FROM xt_products WHERE manufacturers_id =2) Damit wird zum einen eine Verknüpfung zwischen der zu ändernden Sätzen und der Lookuptabelle hergestellt (Subquery), zum anderen wird in der äußeren WHERE Klausel die überhaupt zu bearbeitende Menge in xt_products_description eingeschränkt. Würde die äußere WHERE Klausel wegbleiben, würde dieses UPDATE alle Beschreibungen auf NULL setzen, die in der Subquery keine Entsprechung finden. Des weiteren empfehle ich Dir (und vielleicht auch einigen anderen) dringend dieses Buch Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ripley_one Geschrieben 29. Januar 2010 Autor Teilen Geschrieben 29. Januar 2010 Ich dachte ich grenze die IDs ein indem ich: WHERE manufacturers_id =2 eingebe. Setze ich damit nicht fest, dass nur die product_name mit der ID 2 das Wort Adidas eingefügt bekommen sollen? Wieso muss ich noch die IDs über: where a.products_id=b.products_id beschreiben? Sorry. Wenns zu kompliziert ist, oder zu simpel... aber ich möchts gern vestehen. Hatte mir das Buch auch schon herausgesucht. war mir aber noch uneins ob ich dein vorgeschlagenes oder dieses bestelle. Vielen Dank für deinen Tipp! Werds mir auf jeden Fall besorgen. Dann hören irgendwann diese Knäckebrotfragen Fragen auf! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 29. Januar 2010 Teilen Geschrieben 29. Januar 2010 du würdest ein kathesiches produkt erhalten, da er jeden satz der menge a mit id=2 zu jedem satz der menge b verbinden würde. über die where a.id = b.id klausel verhinderst du das. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.