"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

SQL Tabelleupdate

McDeath98 31.03.2014 - 10:20 2126 11
Posts

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
Hallo

Ich hab das vor Jahren schon mal gemacht und danach nie wieder benötigt.
Ich habe folgendes Problem.

Ich habe auf unserem Onlineshop (nicht über die Software fluchen, ich weiss das Sie Schrott ist, siehe anderer Thread) die mittels cgi arbeitet.

Das bereitet aber in vielen Situationen Probleme. Online Indexierung, Preisportale etc.

Die aktuellen Daten stehen in der Tabelle TEST. Leider sind dort keine statischen Links hinterlegt, was ein erstellen von csv's unmöglich macht.

Mein Script zu erstellen des Files steht, und ich habe eine 2te Tabelle angelegt, in welcher die statischen Links stehen.

nun möchte ich folgendes machen.

In der Tabelle TEST möchte ich das Feld LINK updaten, mit den Daten aus der Tabelle links. Um sicherzustellen, das auch der richtige Artikel den richtigen URL bekommt, habe ich 2 Parameter. Zum einen die SCID (SCID = 1 ist der Shop den ich Updaten möchte) was die ID des Untershops ist, zum anderen die Artikelnummer.

Eigentlich müsste es doch relativ einfach, mit dem Script

Code: SQL
UPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)

gehen. Der Server meldet mir aber

#1242 - Subquery returns more than 1 row

zurück.

Hab ich irgendwas übersehen ?

Nochmal zusammengefasset:

Tabelle TEST Felder:
LINK (soll geupdated werden)
ITEMID (nicht einzigartig, weil mehrere Subshops)
SCID (Nummer der Untershops)

Tabelle Links Felder:
LINK (der statische Link)
ITEMID (die Artikelnummer des entsprechenden Links)

tia

Greetings

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
führ mal die query allein aus

Code: SQL
SELECT LINK, SCID, ITEMID FROM links SCID=1

und schau was als result zurück kommt

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
Zitat von Neo1010
führ mal die query allein aus

Code: SQL
SELECT LINK, SCID, ITEMID FROM links SCID=1

und schau was als result zurück kommt

Code: SQL
SELECT LINK, SCID, ITEMID FROM links where SCID="1"

Gibt mir halt alle Datensätzte der Tabelle zurück

Zeige Datensätze 0 - 29 (1.357 insgesamt, die Abfrage dauerte 0.0004 sek)SQL-Befehl:
Code: SQL
SELECT LINK, SCID, ITEMID
FROM links
WHERE SCID =  "1"
LIMIT 0 , 30

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Meine Query wär jetzt gewesen
Code: SQL
UPDATE Test SET Link = (SELECT Link FROM Links WHERE Links.ItemID = Test.ItemID) WHERE SCID = 1;
Ich hab allerdings das WHERE rausgezogen.

http://sqlfiddle.com/#!2/f4353/1

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
Zitat
SQL-Befehl: Dokumentation

UPDATE TEST SET LINK = ( SELECT LINK
FROM links
WHERE links.ITEMID = TEST.ITEMID )
WHERE SCID =1;


MySQL meldet: Dokumentation

#1242 - Subquery returns more than 1 row

selber fehler

XXXprod

I'm gonna be made!
Avatar
Registered: Jan 2003
Location: Vienna
Posts: 945
Hallo McDeath98,

ich lese leider nicht raus auf welcher Datenbank du die Abfrage ausführen willst aber ich vermute das dies eh Standard-SQL ist. Die Abfrage funktioniert nicht, weil dein SubSelect mehr als eine Zeile zurück gibt. Das Bedeutet, dass in deiner Tabelle Links für zumindest 1 Item mehr als 1 Link angelegt ist. Wie auch immer - damit diese Abfrage so funktioniert musst du es hinbekommen nur 1 Link pro Item zu erhalten.

Möglichkeit:
- Tabelle Links bereinigen, falls sich irrtümlicher weise doppelte Links pro Item darin befinden,
- SubQuery mittels extra Parameter auf 1 Result pro Item reduzieren
- oder mittels "TOP 1"(SQL Server) die Abfrage auf 1 Result limitieren.

Lg, XXX


//Edit Beispiel mit TOP(SQL Server):
Code: SQL
UPDATE TEST SET TEST.LINK = (SELECT TOP 1 LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)
Bearbeitet von XXXprod am 31.03.2014, 11:05

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
ist ne Mysql Datenbank

XXXprod

I'm gonna be made!
Avatar
Registered: Jan 2003
Location: Vienna
Posts: 945
Ok dann so
Code: SQL
UPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1 LIMIT 1)

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14592
Deine annahme, dass ItemID und SCID einen unique key bilden ist offensichtlich falsch:
Code: SQL
SELECT count(*) as cnt, ItemID FROM Links GROUP BY ItemID HAVING cnt>1;
edit: das problem "ich bekomm mehr retour als ich mir erwarte" mit einem "LIMIT 1" zu erschlagen is so ziemlich der schnellste weg in die Hölle.

XXXprod

I'm gonna be made!
Avatar
Registered: Jan 2003
Location: Vienna
Posts: 945
Stimmt natürlich! Ich vemute eher inkonsistente (doppelte, veraltete) Datensätze in der Tabelle die eher bereinigt gehören.

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
In der Tabelle Test kommt die Artikelnummer mehrfach vor und auch die SCID.
In der Kombination kommen beide Werte aber genau 1 mal vor, da ein Artikel in einem Subshop nur 1 mal vorhanden sein kann.

Aber du hattest recht. Beim erstellen der links Tabelle haben sich wohl mehrere doppelt eingeschlichen. Keine Ahnung, wie das passieren kann, aber ich bereinige mal die doppelten und melde mich nochmals.

Danke erstmal

McDeath98

Dark Rider
Avatar
Registered: Jul 2000
Location: Schweiz
Posts: 718
War tatsächlich das Problem. Irgendwie ham die bei den letzten Shop Arbeiten *******e gebaut, und ein paar Files mehrfach hochgeladen.

Dank euch

ps: mein Script war doch richtig ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz