Category: MySQL

  • MySQL – DELETE with a join

    [adsense id=”0514458240″ width=”468″ height=”60″]

    Imagine you want to perform a DELETE from one table but requiring a join across multiple tables. There is a particular syntax which permits this.

    In my example here, I have a sessions table which contains a session which maps to a sessionid. A cart table consists of a list of products, units and a link back to the sessionid. We wish to clear the cart based on the session provided but leave the sessions table as is i.e. without deleting the entry there.

    mysql> select * from sessions where sessionid = 19;
    +-----------+----------------------------------+---------+---------------------+
    | sessionid | session                          | loginid | expiredate          |
    +-----------+----------------------------------+---------+---------------------+
    |        19 | q4f5dj4nh7kkf3ip8u98skaiinc32r14 |       1 | 2012-02-07 19:59:14 | 
    +-----------+----------------------------------+---------+---------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from carts where sessionid = 19;
    +-------+-----------+---------------+
    | units | sessionid | productCodeID |
    +-------+-----------+---------------+
    |     1 |        19 |            27 | 
    |     1 |        19 |            28 | 
    +-------+-----------+---------------+
    2 rows in set (0.00 sec)
    

    The syntax used to DELETE from a table is:

    DELETE table_to_delete FROM table_to_delete JOIN other_tables ON (...) WHERE ...
    

    So in our example above we have to remove based on a session ‘q4f5dj4nh7kkf3ip8u98skaiinc32r14’.

    mysql> DELETE carts c FROM carts c JOIN sessions USING (sessionid) WHERE session = 'q4f5dj4nh7kkf3ip8u98skaiinc32r14';
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> select * from carts where sessionid = 19;
    Empty set (0.00 sec)
    
    mysql> select * from sessions where sessionid = 19;
    +-----------+----------------------------------+---------+---------------------+
    | sessionid | session                          | loginid | expiredate          |
    +-----------+----------------------------------+---------+---------------------+
    |        19 | q4f5dj4nh7kkf3ip8u98skaiinc32r14 |       1 | 2012-02-07 19:59:14 | 
    +-----------+----------------------------------+---------+---------------------+
    1 row in set (0.00 sec)