MySQL 4, añade bastantes características nuevas, que MySQL 3 no soporta.

El problema surge cuando desarrollas con la versión 4, pero el entorno de producción corre una versión 3. En primera instancia, las consultas que usan funcionalidades no soportadas en la vieja versión, directamente ni se ejecutan.

No todo está perdido, y podremos transformar de forma sistemática algunos patrones de consultas de MySQL 4, para que se ejecuten en MySQL 3 sin problemas.

Es útil conservar esta información a mano, para así no tener que pasarse un buen rato buscando en internet cada vez que aparece una situación como ésta. Y lo digo con conocimiento de causa, ya que en el trabajo hemos pasado al menos media hora realizando el proceso.

UNION
/* Consulta original MySQL 4 que usa UNION */
SELECT id FROM table1
UNION SELECT id FROM table2
ORDER BY id

/* Conversion a MySQL 3 usando una tabla auxiliar que contiene un campo num que vale 0, 1, 2, 3, 4,5, … */
SELECT IFNULL(table1.id, table2.id) AS id
FROM _dummy AS D
LEFT JOIN table1 ON (D.num = 0)
LEFT JOIN table2 ON (D.num = 1)
WHERE D.num < 2 AND IFNULL(table1.id,table2.id) IS NOT NULL
ORDER BY id

/* Conversión a MySQL 3 creando una tabla temporal */
CREATE TABLE _tmp TYPE=HEAP SELECT id FROM table1
INSERT INTO _tmp SELECT if FROM table1
INSERT INTO _tmp SELECT if FROM table1
SELECT * FROM _tmp ORDER BY id
DROP TABLE _tmp

/* Conversión a MySQL 3 usando una tabla temporal merge */
CREATE TABLE _tmp TYPE=MERGE UNION=(table1, table2) SELECT id FROM table1
SELECT * FROM _tmp ORDER BY id
DROP TABLE _tmp

IN
/* Consulta original MySQL 4 que usa IN */
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

/* Conversión a MySQL 3 usando JOIN */
SELECT table1.* FROM table1 INNER JOIN table2 ON table1.id=table2.id

NOT IN
/* Consulta original MySQL 4 que usa NOT IN */
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);

/* Conversión a MySQL 3 usando JOIN */
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id<>table2.id WHERE table2.id IS NULL

EXISTS
/* Consulta original MySQL 4 que usa EXISTS */
SELECT * FROM table1 WHERE EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);

/* Conversión a MySQL 3 usando JOIN */
SELECT table1.* FROM table1 INNER JOIN table2 ON table1.id=table2.id

NOT EXISTS
/* Consulta original MySQL 4 que usa NOT EXISTS */
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);

/* Conversión a MySQL 3 usando JOIN */
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id<>table2.id WHERE table2.id IS NULL