consulta mysql php cláusula HAVING
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!
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 useHAVING
para itens que devem estar noWHERE
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;
...
oHAVING
Cláusula pode se referir a funções agregadas, que oWHERE
a 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!