Garwaniny: MySQL - DELETE + INNER JOIN

moin!

Gelöscht werden soll aus der Tabelle users wo die id
die gleiche ist wie in der Tabelle people die uid
(Ist alles in MySQL)

Hier die Tabellen:
^^^^^^^^^^^^^^^^^^

mysql> SELECT * FROM users;
+----+-------+
| id | name  |
+----+-------+
|  1 | lorem |
|  2 | ipsum |
|  3 | dolar |
|  4 | sit   |
|  5 | amet  |
+----+-------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM people;
+----+-----+-----------+
| id | uid | name      |
+----+-----+-----------+
|  1 |   3 | Benjamin  |
|  2 |   4 | Mario     |
|  3 |   5 | Lukas     |
|  4 |   6 | Christoph |
|  5 |   7 | Alex      |
+----+-----+-----------+
5 rows in set (0.00 sec)

Der INNER JOIN greift perfekt:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

mysql> SELECT users.id AS users-id, users.name AS users-name, people.id AS people-id,
people.uid AS people-uid, people.name AS people-name FROM users INNER JOIN people ON users.id = people.uid;
+----------+------------+-----------+------------+-------------+
| users-id | users-name | people-id | people-uid | people-name |
+----------+------------+-----------+------------+-------------+
|        3 | dolar      |         1 |          3 | Benjamin    |
|        4 | sit        |         2 |          4 | Mario       |
|        5 | amet       |         3 |          5 | Lukas       |
+----------+------------+-----------+------------+-------------+
3 rows in set (0.01 sec)

Hier kommt der ERROR
^^^^^^^^^^^^^^^^^^^^

mysql> DELETE FROM users INNER JOIN people ON users.id = people.uid;

ERROR 1064: 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 'INNER JOIN people ON users.id = people.uid' at line 1
mysql>

Das MySQL Manual für Delete
http://dev.mysql.com/doc/mysql/en/delete.html
gibt einen eigenartigen Sytax mit DELETE ... USING ... WHERE an
welcher mir aber ein Rätsel aufgibt zu verstehen.

Das Manual schreibt z.B.
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

Eigentlich würde ich sofern es geht lieber mit JOIN's arbeiten
da mein obiger INNER JOIN die gewünschten Ergebnisse zurück gibt,
und genau diese gelöscht werden sollen.

Es soll sowohl mit INNER, als auch RIGHT OUTER und LEFT OUTER Join gehen.

Falls das mit JOIN's überhaupt nicht geht,
bitte ich um eine Erklärung wie es richtig geht.
Das englische Manual ist etwas schwer.

VLGVSB
Garwaniny

  1. mysql> DELETE FROM users INNER JOIN people ON users.id = people.uid;

    ersetzte das

    INNER JOIN people ON

    mal durch WHERE

    1. moin

      Das gleiche Problem mit WHERE:
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

      mysql> DELETE FROM users INNER JOIN people WHERE users.id = people.uid;
      ERROR 1064: 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 'INNER JOIN people WHERE users.id = people.uid' at line 1
      mysql>

      Warum schreibt man bei JOIN's eigentlich ON und nicht WHERE?
      Worin liegt der unterschied?

      Und wie löse ich mein DELETE Problem nun?

      VLGVSB
      Garwaniny

  2. echo $begrueszung;

    mysql> DELETE FROM users INNER JOIN people ON users.id = people.uid;
    Das MySQL Manual für Delete
    http://dev.mysql.com/doc/mysql/en/delete.html

    beschreibt zwei Beispiele für die "Multiple-table syntax". Benutze doch einfach eine von denen richtig: :-)

    DELETE zu_löschende_tabelle FROM zu_löschende_tabelle JOIN verknüpfte_tabelle ....

    echo "$verabschiedung $name";

    1. moin

      DELETE zu_löschende_tabelle FROM zu_löschende_tabelle JOIN verknüpfte_tabelle ....

      Habs nun so versucht:

      DELETE users FROM users INNER JOIN people WHERE users.id = people.uid;

      Faszinierend...!
      Warum funktioniert das so?

      warum 2 mal users ?
      Was macht das für einen Sinn?

      Und warum ist im MySQL Manual nirgends eine solche Vorgehensweise
      beshcrieben und nur so ein komischer DELETE ... USING ... WHERE Syntax?

      Gibts dazu gutes Dokumentationsmanual online?

      VLGVSB
      Garwaniny

      1. echo $begrueszung;

        DELETE users FROM users INNER JOIN people WHERE users.id = people.uid;

        Faszinierend...!
        Warum funktioniert das so?

        Weil das die (eine von beiden) von MySQL erwartete Syntax ist :-)

        warum 2 mal users ?
        Was macht das für einen Sinn?

        Das hat den Sinn, dass MySQL nun weiß, dass es nur im ersten users zu löschen hat, aber zum Ermitteln der zu löschenden Datensätze users und weitere Tabellen heranziehen soll.

        Und warum ist im MySQL Manual nirgends eine solche Vorgehensweise
        beshcrieben und nur so ein komischer DELETE ... USING ... WHERE Syntax?

        Wieso? Das ist doch exakt dort auf der von dir erwähnten Handbuchsteite so zu finden.

        echo "$verabschiedung $name";