Update über einen Join

Hi Leute,

ich bin relativ neu im Thema Datenbanken!
Ich habe eine DB “modules” gegeben, dass z.B. aus drei Tabellen m1,m2,m3 (Namen sind egal!) besteht und diese haben die gleiche Struktur:

TaskCommonDim|Resource|TaskStart|TaskEnd|Piority|TaskProcessed
(ist leider so gegeben!)
Ich joine per SQL die Tabellen:


SELECT m1.TaskCommonDim, m1.TaskStart, m1.TaskProcessed, m2.TaskStart, m2.TaskProcessed, m3.TaskStart, m2.TaskProcessed
FROM m1 AS m1
JOIN m2 AS m2 ON ( m1.TaskCommonDim = m2.TaskCommonDim )
JOIN m3 AS m3 ON ( m1.TaskCommonDim = m3.TaskCommonDim )
WHERE m1.TaskProcessed = '0' AND m2.TaskProcessed = '0' AND m3.TaskProcessed = '0' 
TaskStart ist vom Typ Datetime und
"TaskProcessed" vom Typ int(1), d.h. es kann 0 oder 1 sein

Nun wollte ich die geringste Datetime aus “TaskStart” (aus der gejointen Tabelle)


UPDATE m1 SET TaskProcessed=true WHERE TaskStart=(SELECT min(TaskStart) FROM m1 );

Wie kann ich meine Join-Anfrage mit der obigen Update-Anfrage kombinieren? Ich möchte praktisch die kleinste Startzeit aus allen Tabellen und dann “TaskProcessed” in der entsprechenden Zeile der gejointen Tabelle auf 1 setzen!

Du bist mit dem Subselect imho schon auf einem guten Weg.

Aber: du hast da MySQ am laufen, oder? Das Forum hier behandelt PostgreSQL.

Ja ich benutze MySQL!
Bin wie gesagt I noob! Ich dachte die Syntax ist in jeder DB gleich! Kann mir trotzdem jemand helfen??? BIITTTTEEE!!!

Das trifft für viele Datenbanken zu - aber nicht für MySQL.
Die machen gern vieles anders.


Kann mir trotzdem jemand helfen??? BIITTTTEEE!!!

Schau mal bei MySQL Query Analyzer - Improving SQL Query Performance unter Support.

Hi Leute,
ich habe nun folgendes ausprobiert und es klappt!

SELECT min(X.TaskStart)  FROM  
(   SELECT * FROM m1    
    UNION ALL    
    SELECT * FROM m2    
    UNION ALL    
    SELECT * FROM m3  
 ) AS X
 WHERE TaskProcessed = 0

Nun habe ich probleme dieses UPDATE noch einzu bauen. Ich dacht ich mach folgendes:

UPDATE m1 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)

UPDATE m2 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)

UPDATE m3 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
  SELECT * FROM m1
  UNION ALL
  SELECT * FROM m2
  UNION ALL
  SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)

Ich weiß nicht recht wie ich die “Aliase”(AS X,…) setzen soll! Wenn ichs wie oben mache, also nur bei “min(TaskStart)” und z.B. X,Y,Z nutze, kommt folgende Meldung:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS X'

Vielleicht solltest du den Tabellen andere Namen geben . das geht über Aliase,

Wie genau meist du das?

UPDATE m1 AS X SET X.TaskProcessed = true WHERE XTaskStart =
(
  SELECT min(X.TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE X.TaskProcessed = 0
)

UPDATE m2 AS Y SET Y.TaskProcessed = true WHERE Y.TaskStart =
(
  SELECT min(Y.TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE Y.TaskProcessed = 0
)

UPDATE m3 AS Z SET Z.TaskProcessed = true WHERE Z.TaskStart =
(
  SELECT min(Z.TaskStart)
  FROM
  (
  SELECT * FROM m1
  UNION ALL
  SELECT * FROM m2
  UNION ALL
  SELECT * FROM m3
  )
  WHERE Z.TaskProcessed = 0
)

Hier kommt:

#1248 - Every derived table must have its own alias