Respostas:
O SQL é avaliado ao contrário, da direita para a esquerda. Portanto, a cláusula where é analisada e avaliada antes da cláusula select. Por esse motivo, o alias de u_name para user_name ainda não ocorreu.
Consulte a seguinte página de manual do MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"Um select_expr pode receber um alias usando AS alias_name. O alias é usado como o nome da coluna da expressão e pode ser usado nas cláusulas GROUP BY, ORDER BY ou HAVING."
(...)
Não é permitido fazer referência a um alias de coluna em uma cláusula WHERE, porque o valor da coluna ainda não pode ser determinado quando a cláusula WHERE for executada. Consulte a Seção B.5.4.4, “Problemas com aliases de coluna”.
select u_name as user_name from users where u_name = "john";
Pense assim, sua cláusula where avalia primeiro, para determinar quais linhas (ou linhas unidas) precisam ser retornadas. Depois que a cláusula where é executada, a cláusula select é executada.
Para colocar de uma maneira melhor, imagine o seguinte:
select distinct(u_name) as user_name from users where u_name = "john";
Você não pode fazer referência à primeira metade sem a segunda. Onde sempre é avaliado primeiro, depois a cláusula select.
Se você estiver tentando executar uma consulta como a seguinte (encontre todos os nós com pelo menos um anexo) em que você usou uma instrução SELECT para criar um novo campo que não existe realmente no banco de dados e tente usar o alias para esse resultado, você encontrará o mesmo problema:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Você receberá um erro "Coluna desconhecida 'attachmentcount' na cláusula WHERE".
A solução é realmente bastante simples - basta substituir o alias pela declaração que produz o alias, por exemplo:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
Você ainda receberá o alias retornado, mas agora o SQL não deve trabalhar com o alias desconhecido.
(
na sua consulta antes da (COUNT(*)
que não seja fechada em nenhum lugar.
Seu definido alias
não é bem-vindo pela WHERE
cláusula em que você deve usar a HAVING
cláusula para este
SELECT u_name AS user_name FROM users HAVING user_name = "john";
OU você pode usar diretamente o nome da coluna original com o WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
O mesmo que o resultado no alias definido pelo usuário como resultado da subconsulta ou de qualquer cálculo que será acessado pela HAVING
cláusula e não peloWHERE
SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users WHERE u_name = "john" HAVING user_last_name ='smith'
Ou:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
ou:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
O último deve ser o mesmo que o primeiro se o RDBMS suportar o envio de predicado para a exibição em linha.
corrigido:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Não, você precisa selecioná-lo com o nome correto. Se você forneceu a tabela que selecionou de um alias, você pode usá-lo.
Não, você não pode. user_name is não existe até a hora do retorno.
Coluna desconhecida na WHERE
cláusula causada pelas linhas 1 e 2 e resolvida pela linha 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Pode ser que ajude.
Você pode
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Funciona.
MAS TENHA CERTEZA DO QUE VOCÊ FAZ!
Mas, pode ser que isso ajude em alguns casos
Embora você possa criar um alias de suas tabelas em sua consulta (por exemplo, "SELECT u.username FROM users u;"), você deve usar os nomes reais das colunas às quais está fazendo referência. O AS afeta apenas como os campos são retornados.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Só tive esse problema.
Verifique se não há espaço no nome da entidade no banco de dados.
por exemplo, 'nome_do_usuário' em vez de 'nome_do_usuário'
tente sua tarefa usando a condição IN ou OR e também esta consulta está funcionando no spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
ou
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Eu tive o mesmo problema, achei isso útil.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
lembre-se de colocar $ user em '' aspas simples.