Consulta em 4 tabelas em uma única query

Olá, esta ocorrendo um erro no meu SQL. Preciso colocar em uma única query uma consulta de 4 tabelas.

Minhas Tabelas para esta consulta e seus campos:

Tabela: anuncio - Campos: codigo, subcodigo, sequencia, url, visualizacao, categoria1, categoria2, status, plano, extra
Tabela: cidade - Campos: codigo, nomecidade
Tabela: estado - Campos: codigo, sigla
Tabela: empresa - Campos: codigo, subcodigo, sequencia, codigocidade, codigoestado

Bom, a consulta deve mostrar os campos:

  • url da tabela anuncio
  • nomecidade da tabela cidade
  • sigla da tabela estado

Existe outros campos envolvidos, mas preferi simplificar para facilitar a leitura.

Sendo que:

  • o codigo, subcodigo e sequencia da tabela anuncio deve ser igual da tabela empresa
  • o codigo da tabela cidade deve ser igual da tabela empresa campo codigocidade
  • o codigo da tabela estado deve ser igual da tabela empresa campo codigoestado

O where deve mostrar:

  • somente o parametro igual aos dados dos campos categoria1 ou categoria2 da tabela anuncio
  • e status igual a 1
  • e visualizacao menor que (plano + extra)
  • e informar qual o registro atual e limitar o numero do registro na pagina.

Abaixo o meu SQL no Banco de Dados MySql:

select
anuncio.codigo, anuncio.subcodigo, anuncio.sequencia, anuncio.url, anuncio.visualizacao,
cidade.nomecidade,
estado.sigla

from anuncio

inner join ((cidade inner join empresa on cidade.codigo = empresa.codigocidade)

inner join estado on empresa.codigoestado = estado.codigo) on ((anuncio.codigo = empresa.codigo) and
(anuncio.subcodigo = empresa.subcodigo) and
(anuncio.sequencia = empresa.sequencia))

where
(anuncio.categoria1 = ‘$categoria’ or anuncio.categoria2 = ‘$categoria’) and
anuncio.status = ‘1’ and
anuncio.visualizacao < (anuncio.plano + anuncio.extra)
limit $registro, $limite

Obrigado desde já pela ajuda.

Quase tudo show na descrição, só faltou o erro :cry: . De qualquer maneira, vamos tentar ajudar.

O problema tem cara de estar aqui

inner join ((cidade inner join empresa on cidade.codigo = empresa.codigocidade) inner join estado on empresa.codigoestado = estado.codigo) on ((anuncio.codigo = empresa.codigo) and (anuncio.subcodigo = empresa.subcodigo) and (anuncio.sequencia = empresa.sequencia))

Mude para:

empresa inner join cidade on (cidade.codigo = empresa.codigocidade) inner join estado on (empresa.codigoestado = estado.codigo) inner join anuncio on ((anuncio.codigo = empresa.codigo) and (anuncio.subcodigo = empresa.subcodigo) and (anuncio.sequencia = empresa.sequencia))

Como é tudo inner join, não precisa desse excesso de parênteses. Mais do que isso, a sintaxe de um join deve ser sempre como:

TABELA1 INNER JOIN TABELA2 on (TABELA1.CAMPO1 = TABELA2.CAMPO2)

Um site interessante que sempre gosto de indicar é o http://sqlzoo.net. Dá uma olhada depois.

abraços,

otávio

Só mais uma coisa, evite joins como esse:

((anuncio.codigo = empresa.codigo) and (anuncio.subcodigo = empresa.subcodigo) and (anuncio.sequencia = empresa.sequencia))

Porque a performance é bem ruinzinha. Se for fazer isso, pelo menos garanta um índice na tabela empresa usando os 3 campos (e dependendo, crie o mesmo índice na tabela anúncio).