No, they are not equivalent. Example:
CREATE TABLE a
( keya int ) ;
CREATE TABLE b
( keyb int ) ;
CREATE TABLE c
( keyc int ) ;
INSERT INTO a
VALUES
(1) ;
INSERT INTO b
VALUES
(1),(2) ;
INSERT INTO c
VALUES
(2) ;
Results:
SELECT *
FROM a
LEFT JOIN b
ON a.keya = b.keyb
INNER JOIN c
ON c.keyc = b.keyb ;
Result
| keya | keyb | keyc |
SELECT *
FROM a
LEFT JOIN
( SELECT b.*, c.*
FROM b
INNER JOIN c
ON c.keyc = b.keyb
) sub
ON a.keya = sub.keyb ;
Result
| keya | keyb | keyc |
| 1 | NULL | NULL |
How this happens is a LEFT JOIN b INNER JOIN cparsed as (a LEFT JOIN b) INNER JOIN c, which is equivalent (a INNER JOIN b) INNER JOIN c, because the condition in the join INNERcancels the join LEFT.
You can also record the second request in this form - without a subquery - which is analyzed as a a LEFT JOIN (b INNER JOIN c)result of the different placement of offers ON:
SELECT *
FROM a
LEFT JOIN
b
INNER JOIN c
ON c.keyc = b.keyb
ON a.keya = b.keyb ;
Result
| keya | keyb | keyc |
| 1 | NULL | NULL |