Pergunta

Estou tentando fazer esta consulta funcionar, mas recebo este erro:Coluna desconhecida 'zips.city' em 'havendo cláusula'

`$query = "SELECT
    zips.*
    FROM
    zips
    HAVING
    zips.city LIKE '%$city%' 
    AND
    zips.stateabbr LIKE '%$state%' 
    LIMIT 1";
$result = mysql_query($query) or die (mysql_error());`

minha tabela zips tem uma coluna de cidade, então não tenho certeza qual é o problema, sei que estou acessando o banco de dados porque posso executar esta consulta sem erros:

$zip1query = "SELECT 
         zips.*
         FROM 
         zips
         WHERE
         zips.zip = '$zip'              
         ";

Qualquer conselho seria muito apreciado!obrigado!

Foi útil?

Solução

o having Cláusula não significa a mesma coisa que o where Cláusula: Ao executar uma consulta simples, você deve usar where - que foi o que você fez em sua segunda consulta, que funciona.

having é usado quando a condição deve ser aplicada no resultado de um group by cláusula.


O que significa que, aqui, sua consulta deve ser construída da seguinte maneira:

$query = "SELECT zips.*
    FROM zips
    where zips.city LIKE '%$city%' 
        AND zips.stateabbr LIKE '%$state%' 
    LIMIT 1";


Com isso, se você ainda tiver um erro sobre uma coluna inexistente ou não encontrada (pelo menos para city e/ou stateabbr), será porque essa coluna não existe em sua tabela.

Nesse caso, não há muito que possamos fazer: você terá que verificar a estrutura da sua tabela, para determinar quais colunas ela contém.

Você pode verificar essa estrutura usando uma ferramenta baseada na Web como o phpmyadmin ou usando uma instrução SQL como:

desc zips;


Para referência, citando Página manual do MySQL para select :

O padrão SQL exige que ter referência a referência a apenas colunas no GROUP BY Cláusula ou colunas usadas em funções agregadas.
...

Não use HAVING para itens que devem estar no WHERE cláusula.
Por exemplo, não escreva o seguinte:

SELECT col_name FROM tbl_name HAVING col_name > 0;

Escreva isso em vez disso:

SELECT col_name FROM tbl_name WHERE col_name > 0;

...
o HAVING Cláusula pode se referir a funções agregadas, que o WHEREa cláusula não pode

Outras dicas

Tente usar WHERE em vez de HAVING.

A maneira correta de fazer isso é usando uma cláusula onde.

$query = "SELECT
zips.*
FROM
zips
WHERE
zips.city LIKE '%$city%' 
AND
zips.stateabbr LIKE '%$state%' 
LIMIT 1";

Ter deve ser usado quando você está agrupando, veja aqui para uma explicação

Ó jeez, desculpe pessoal, eu descobri o problema, aparentemente coloquei um espaço antes da cidade quando nomeei as colunas na minha mesa. Então, eu renomeei a coluna e funciona, obrigado de qualquer maneira! Mas, usando a função onde, em vez de ter, deve acelerar muito as coisas, obrigado pessoal!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top