SQL Anfängerproblem - Update mit Referenz zu zweiter Tabelle

blöderidiot

Captain
Registriert
Juni 2004
Beiträge
3.879
Liebe Mistreiter,

da ich nach langer Zeit wieder mal was mit SQL zu machen habe und weiss, dass sich hier im Forum Leute tummeln, die schon mal diese drei Buchstaben gehört haben, möchte ich gerne eine Frage stellen. Soweit habe ich alles hinbekommen - ausser ein kombiniertes Update mit Select auf Fremdtabelle. Also mache ich erst den Select und dann mit dem Ergebnis das Update (MySQL/MariaDB). Involviert sind zwei Tabellen, einmal "location" und einmal "person". Aus einer Anwendung (vor dem ersten Select) bekomme ich "lid" (ASCII, für location) "uid" (ASCII, für person). Nun gehört aber zu "person" eine "location_id", welche den Primärschlüssel ("id", Int) für "location" enthält. Also gehe ich in einen Select, um "id" aus "lid" zu erhalten:
SQL:
  SELECT
  l.id, l.lid
    FROM location l
      WHERE l.lid = "$lid"
um dann in der Anwendung die erhaltene, zu "lid" gehörige "id" nach dem Fetch abzuspeichern:
$id = $row[0]
um dann damit die "person" mit "uid" mit diesem "id" upzudaten:
SQL:
  UPDATE person
    SET person.location_id = $id
      WHERE person.uid = "$uid"
Aber dass muss doch ganz einfach gehen. Ich komm' nur nicht drauf.

Danke schonmal!
 
floq0r schrieb:
AFAIK musst du das Alias auch verwenden wenn du eines setzt:
SQL:
UPDATE p
[...]
Ahh, danke! Ich muss ja noch die richtige "uid" beachten, so hab ich das einfach umgedreht und es scheint soweit zu funktionieren. Oder sieht das "ineffizient" aus?
SQL:
UPDATE person AS p
  INNER JOIN location AS l
    ON l.lid = "$lid"
      SET p.location_id = l.id
        WHERE p.uid = "$uid"
Wie würde man das schöner machen?
 
Vom Aufbau her ist so wie @floq0r geschrieben hat standard
 
  • Gefällt mir
Reaktionen: blöderidiot
Oelepoeto schrieb:
Vom Aufbau her ist so wie @floq0r geschrieben hat standard
Ja, aber wie geht das?
So funktioniert das nicht:
SQL:
UPDATE p
  SET p.location_id = l.id
    FROM person p
      WHERE p.uid = "$uid"
        INNER JOIN location l
          ON l.lid = "$lid"
Aber "andersrum" schon (s.o.).
 
Ach so, nicht genau genug geschaut. Die Where-Bedingungen kommen immer nach allen Joins.
 
Zurück
Oben