2011-01-08 15 views
1

ich so etwas tun möchten:MYSQL: Unterabfrage in eine Tabelle in der Hauptabfrage aktualisiert

  1. In Tabelle TAGS finden Sie eine Zeile mit name = ‚somename‘ und remeber es ist id
  2. In die gleiche Tabelle eine weitere Zeile mit someCondition finden und in dieser Zeile col refference = die ID gesetzt von oben

versucht, dies mit einer Unterabfrage zu tun, aber mysql verweigerten ich nicht sagen, eine Tabelle Unterabfrage kann, dass ich die Aktualisierung in der Hauptabfrage.

Wie kann ich die obige Idee anders umsetzen?

Danke

Antwort

0

können Sie tun, um diese

update TAGS set 
    reference = 
     (select my_id from 
      (select id as my_id from TAGS where name='someName') 
     as SUB_TAGS) 
    where someCondition; 

Nicht jedoch ratsam.


Edit # 1 Sie die Unterabfragen ganz vermeiden kann - wie taspeotis rightly mentioned, durch join mit den Kriterien die gleiche Tabelle ing. Hier geht der Code dafür:

UPDATE 
    TAGS t1, TAGS t2 
    SET 
    t1.reference = t2.id 
    WHERE 
     t2.name = 'someName' 
    AND 
     t1.someField = someCondition; 

Dies ist ein besserer Ansatz.

+0

Ich denke, die doppelte Verschachtelung zur Problemumgehung genau das Problem, das mysql mir gemeldet hat? und warum nicht ratsam? – shealtiel

+0

Die Verwendung von temporären Tabellen ist nicht ratsam - und genau das mache ich hier. Temporäre Tabellen haben einen unnötigen Overhead. – Nishant

+0

@gidireich wow, war mein Stammeswissen falsch? Ich sehe nicht viele Artikel über Performance Overhead von temporären Tabellen in mySQL beim googlen herum. – Nishant

1

Convert your subquery to a join und dann UPDATE:

Sie auch UPDATE-Operationen die für mehrere Tabellen durchführen können. Sie können ORDER BY oder LIMIT jedoch nicht mit einem UPDATE für mehrere Tabellen verwenden. Die Klausel table_references listet die am Join beteiligten Tabellen auf. Seine Syntax ist in Abschnitt 12.2.8.1, "JOIN-Syntax" beschrieben. Hier ein Beispiel:

UPDATE items,month SET items.price=month.price 
WHERE items.id=month.id; 
The preceding example shows an inner join that uses the comma operator, but multiple-table 

UPDATE-Anweisungen, jede Art von in SELECT-Anweisungen zulässig join, wie LEFT JOIN verwenden können.

Verwandte Themen