RSS icon Bullet (black)
  • HostPHD – Por que consigo executar uma determinada query no MySQL 4, mas não consigo executá-la no MySQL 5?

    Posted on May 27th, 2010 Revenda de Hospedagem - HostPHD No comments

    O MySQL 5 está mais rígido quanto à leitura de queries. Por este motivo uma query que não esteja totalmente estruturada pode apresentar algum erro, o que não ocorre no MySQL 4, pois esta versão possui um tipo diferente de análise.

    Vamos supor que você esteja executando a query abaixo:

    SELECT count( DISTINCT p.products_id ) AS total
    FROM products p
    LEFT JOIN manufacturers m
    USING ( manufacturers_id ) , products_description pd
    LEFT JOIN specials s ON p.products_id = s.products_id, categories c, products_to_categories p2c
    WHERE p.products_status = ’1′
    AND p.products_id = pd.products_id
    AND pd.language_id = ’4′
    AND p.products_id = p2c.products_id
    AND p2c.categories_id = c.categories_id
    AND (
    (
    pd.products_name LIKE ‘%dvd%’
    OR p.products_model LIKE ‘%dvd%’
    OR m.manufacturers_name LIKE ‘%dvd%’
    )
    )

    Ela seria executada normalmente no MySQL 4, porém, ao executá-la no MySQL 5 ocorre o seguinte erro:

    #1054 – Unknown column ‘p.products_id’ in ’on clause’

    Para solucionar este problema é necessário realizar uma pequena mudança na estrutura da query removendo as tabelas existentes entre os JOIN’s e colocando-as logo após, deixando a query com uma estrutura mais lógica como mostra abaixo:

    SELECT count( DISTINCT p.products_id ) AS total
    FROM products p
    LEFT JOIN manufacturers m USING ( manufacturers_id )
    LEFT JOIN specials s ON (s.products_id = p.products_id),
    products_description pd, categories c, products_to_categories p2c
    WHERE p.products_status = ’1′
    AND p.products_id = pd.products_id
    AND pd.language_id = ’4′
    AND p.products_id = p2c.products_id
    AND p2c.categories_id = c.categories_id
    AND (
    (
    pd.products_name LIKE ‘%dvd%’
    OR p.products_model LIKE ‘%dvd%’
    OR m.manufacturers_name LIKE ‘%dvd%’
    )
    )