Дата: 25.11.2013
Автор: Даниил Каменский , dkamenskiy (at) yandex (dot) ru
При использовании ряда CMS (например, DLE, vBulletin и др.) временами возникает ошибка mysql с номером 1054.
Текст ошибки Unknown column ‘ИМЯ_СТОЛБЦА’ in ‘field list’ в переводе означает «Неизвестный столбец ‘ИМЯ_СТОЛБЦА’ в списке полей.«. Такая ошибка возникает в том случае, если попытаться выбрать (запрос вида select) или изменить (запрос вида update) данные из столбца, которого не существует. Ошибка чаще всего возникает из-за стoронних модулей. Перечислим несколько возможных причин:
- установлен модуль, расчитанный на более новую версию CMS, чем используемая;
- при установке модуля не выполнились операции изменения структуры таблиц;
- после установки сторонних модулей выполнено обновление системы, которое привело к изменению структуры таблиц; при этом модуль не был обновлен на совместимый;
- Из резервной копии восстановлена более старая база данных, а файлы сайта остались в новой версии.
Пример №1:
Имеется таблица сотрудников подразделения.
Поля: id, фамилия, имя, отчество, год рождения, наличие высшего образования.
create table if not exists employee
(
`id` int(11) NOT NULL auto_increment primary key,
`surname` varchar(255) not null,
`name` varchar(255) not null,
`patronymic` varchar(255) not null,
`year_of_birth` int unsigned default 0,
`higher_education` tinyint unsigned default 0
) ENGINE=MyISAM;
Если обратиться к этой таблице с запросом на выборку несуществующего поля, например пола сотрудника по фамилии Власенко, то результатом будет вышеуказанная ошибка:
mysql> select sex from employee where surname=’Власенко’;
ERROR 1054 (42S22): Unknown column ‘sex’ in ‘field list’
Пример №2:
Воспользуемся той же таблицей из примера 1. Если попытаться указать мужской пол у сотрудника по имени Власенко (выяснилось его имя и стало ясно, что это мужчина), то результатом будет та же ошибка:
mysql> update employee set sex=1 where surname=’Власенко’;
ERROR 1054 (42S22): Unknown column ‘sex’ in ‘field list’
Способы борьбы
Самый корректный способ борьбы в устранении причины ошибки. Например, все обновления сайта рекомендуем выполнять сначала на копии сайта и если ошибок нет, то повторять на рабочем сайте. Если при обновлении возникла ошибка, следует найти способ сделать обновление корректно с учетом версий сторонних модулей.
Если по каким-то причинам корректно избежать ошибки не получилось, можно прибегнуть к симптоматическому лечению, которое состоит в простом добавлении недостающих полей в таблицу.
Запрос на добавление:
ALTER TABLE employee ADD COLUMN sex ENUM(‘male’, ‘female’) DEFAULT ‘female’
Что в переводе означает «Изменить таблицу employee, добавив столбец `пол`, назначив ему тип перечисление(мужской/женский) по умолчанию мужской».
При таком добавлении столбца необходимо учитывать, что у всех записей в таблице в столбце sex появится значение по умолчанию. Если добавлять такой столбец как пол (который не может быть равен null и обязательно присутствует у каждого человека), то просто необходимо сразу же
после этого прописать нужное значение во все записи в таблице. В данном случае с добавлением столбца «пол» нужно будет поменять значение на male у всех сотрудников мужского пола.
Трудности могут возникнуть из-за того, что часто нужно самостоятельно определять тип добавляемого столбца.
Примеры:
a) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product
IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
Ответ сервера:
Invalid SQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where
product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
MySQL Error: Unknown column ‘faqname’ in ‘field list’
Error Number: 1054
Отсутствует столбец faqname, добавим его. Логика подсказывает, что если имя — то это скорее всего символы, а не целое число или тип datetime. Количество символов заранее, конечно, неизвестно, но редко имя бывает больше чем 255 символов. Поэтому добавим столбец faqname с указанием типа varchar(255):
ALTER TABLE faq ADD faqname varchar(255)
б) Запроc:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_html=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_html=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_html’ in ‘field list’
Error Number: 1054
Отсутствует столбец allow_html, добавим его. Смотрим на то значение, которое туда пытается вставить запрос, видим 0. Скорее всего этот столбец может принимать два значения — разрешить/не разрешить (1 или 0), то есть однобайтное целое число вполне подойдёт. Поэтому добавим столбец allow_html с указанием типа tinyint:
ALTER TABLE faq ADD allow_html tinyint
Таким образом можно составить шаблон для «лечения» таких проблем: ALTER TABLE [a] ADD [b] [c];, где
a — имя таблицы, откуда выбираются (или где обновляются) данные;
b — имя столбца, который нужно добавить;
c — тип данных.
Примеры (во всех примерах идёт работа с таблицей dle_usergroups):
1) Запрос:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_html=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_html=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_html’ in ‘field list’
Error Number: 1054
Решение:
a=dle_usergroups, b=allow_html, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_html tinyint
Для того, чтобы выполнить исправляющий ошибку запрос, необходимо воспользоваться каким-либо mysql-клиентом. В стандартной поставке mysql всегда идёт консольный клиент с названием mysql (в windows mysql.exe). Для того, чтобы подключиться к mysql выполните команду
mysql -hНАЗВАНИЕ_ХОСТА -uИМЯ_ПОЛЬЗОВАТЕЛЯ -pПАРОЛЬ ИМЯ_БАЗЫ_ДАННЫХ,
после чего введите необходимый запрос и точку с запятой после него в появившейся командной строке.
В том случае, если работа происходит на чужом сервере (например, арендуется хостинг) и нет возможности воспользоваться mysql-клиентом из командной строки (не всегда хостеры представляют такую возможность), можно воспользоваться тем инструментом, который предоставляет хостер — например, phpMyAdmin, и в нём ввести нужный sql-запрос.
В то же время наиболее подходящий инструмент для работы с mysql — это MySQL Workbench — разработка создателей mysql с достаточно удобным пользовательским интерфейсом.
Если же нет возможности подключиться к mysql напрямую (например из-за ограничений файрвола), то в ряде случаев возможно удалённо подключиться к MySQL-серверу через SSH-туннель.
2) Запрос:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_subscribe=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_subscribe=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_subscribe’ in ‘field list’
Error Number: 1054
Решение:
a=dle_usergroups, b=allow_subscribe, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_subscribe tinyint
3) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
Oтвет сервера:
InvalidSQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
MySQL Error: Unknown column ‘faqname’ in ‘field list’
Error Number: 1054
Решение:
a= faq, b=faqname, c=varchar(255), то есть
ALTER TABLE faq ADD faqname varchar(255)
Результат
В результате добавления необходимого поля ошибка должна исчезнуть. Однако, существует вероятность того, что в структуре таблиц не хватало несколько столбцов: в этом случае ошибка повторится с указанием другого имени столбца, для которого потребуется повторить процедуру. Помните, что добавление незаполненных столбцов угаданного типа не всегда будет соответствовать задуманной логике приложения и может нарушить часть функциональности.
Источник: webew.ru
Дата публикации: 25.11.2013
© Все права на данную статью принадлежат порталу SQLInfo.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.
I have a simple query:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
I get Unknown Column 'user_name' in where clause. Can I not refer to 'user_name' in other parts of the statement even after select 'u_name as user_name'?
Btuman
8812 gold badges9 silver badges37 bronze badges
asked Sep 30, 2008 at 15:37
0
SQL is evaluated backwards, from right to left. So the where clause is parsed and evaluate prior to the select clause. Because of this the aliasing of u_name to user_name has not yet occurred.
idmean
14.5k9 gold badges53 silver badges83 bronze badges
answered Sep 30, 2008 at 15:41
dacracotdacracot
22k26 gold badges104 silver badges151 bronze badges
4
What about:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
Marcus Adams
52.7k9 gold badges90 silver badges143 bronze badges
answered Oct 4, 2010 at 15:03
SeptimusSeptimus
6295 silver badges3 bronze badges
2
See the following MySQL manual page: http://dev.mysql.com/doc/refman/5.0/en/select.html
«A select_expr can be given an alias
using AS alias_name. The alias is used
as the expression’s column name and
can be used in GROUP BY, ORDER BY, or
HAVING clauses.»
(…)
It is not permissible to refer to a column alias in a WHERE clause,
because the column value might not yet be determined when the WHERE
clause is executed. See Section B.5.4.4, “Problems with Column
Aliases”.
answered Sep 30, 2008 at 15:44
Paul DixonPaul Dixon
295k53 gold badges310 silver badges348 bronze badges
1
select u_name as user_name from users where u_name = "john";
Think of it like this, your where clause evaluates first, to determine which rows (or joined rows) need to be returned. Once the where clause is executed, the select clause runs for it.
To put it a better way, imagine this:
select distinct(u_name) as user_name from users where u_name = "john";
You can’t reference the first half without the second. Where always gets evaluated first, then the select clause.
answered Sep 30, 2008 at 15:41
Mark S.Mark S.
1,0721 gold badge12 silver badges22 bronze badges
If you’re trying to perform a query like the following (find all the nodes with at least one attachment) where you’ve used a SELECT statement to create a new field which doesn’t actually exist in the database, and try to use the alias for that result you’ll run into the same problem:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
You’ll get an error «Unknown column ‘attachmentcount’ in WHERE clause».
Solution is actually fairly simple — just replace the alias with the statement which produces the alias, eg:
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;
You’ll still get the alias returned, but now SQL shouldn’t bork at the unknown alias.
answered May 26, 2011 at 11:04
JonJon
1211 silver badge2 bronze badges
5
Your defined alias are not welcomed by the WHERE clause you have to use the HAVING clause for this
SELECT u_name AS user_name FROM users HAVING user_name = "john";
OR you can directly use the original column name with the WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Same as you have the result in user defined alias as a result of subquery or any calculation it will be accessed by the HAVING clause not by the WHERE
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'
answered Jul 30, 2013 at 17:28
M Khalid JunaidM Khalid Junaid
63.7k10 gold badges89 silver badges118 bronze badges
Either:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
or:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
The latter ought to be the same as the former if the RDBMS supports predicate pushing into the in-line view.
answered Sep 30, 2008 at 15:41
David AldridgeDavid Aldridge
51.3k8 gold badges68 silver badges95 bronze badges
corrected:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
answered Sep 30, 2008 at 15:39
Steven A. LoweSteven A. Lowe
60.1k18 gold badges131 silver badges202 bronze badges
No you need to select it with correct name. If you gave the table you select from an alias you can use that though.
answered Sep 30, 2008 at 15:38
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Jason Plank
2,3425 gold badges31 silver badges40 bronze badges
answered Apr 23, 2009 at 8:44
1
No you cannot. user_name is doesn’t exist until return time.
answered Sep 30, 2008 at 15:38
Jarrett MeyerJarrett Meyer
19.3k6 gold badges58 silver badges52 bronze badges
Unknown column in WHERE clause caused by lines 1 and 2 and resolved by line 3:
$sql = "SELECT * FROM users WHERE username =".$userName;$sql = "SELECT * FROM users WHERE username =".$userName."";$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Jason Plank
2,3425 gold badges31 silver badges40 bronze badges
answered Jan 28, 2010 at 23:06
1
May be it helps.
You can
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
It works.
BUT MAKE SURE WHAT YOU DO!
- Indexes are NOT USED here
- There will be scanned FULL TABLE — you hasn’t specified the LIMIT 1 part
- So, — THIS QUERY WILL BE SLLLOOOOOOW on huge tables.
But, may be it helps in some cases
answered Nov 22, 2011 at 10:59
While you can alias your tables within your query (i.e., «SELECT u.username FROM users u;»), you have to use the actual names of the columns you’re referencing. AS only impacts how the fields are returned.
answered Sep 30, 2008 at 15:41
BlumerBlumer
4,9952 gold badges33 silver badges47 bronze badges
1
Just had this problem.
Make sure there is no space in the name of the entity in the database.
e.g. ‘ user_name’ instead of ‘user_name’
answered Apr 2, 2015 at 15:15
0
I had the same problem, I found this useful.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
remember to put $user in ‘ ‘ single quotes.
answered Jan 5, 2013 at 10:05
devWaleeddevWaleed
4673 silver badges14 bronze badges
1
When you execute a MySQL statement, you may sometimes encounter ERROR 1054 as shown below:
mysql> SELECT user_name FROM users;
ERROR 1054 (42S22): Unknown column 'user_name' in 'field list'
The ERROR 1054 in MySQL occurs because MySQL can’t find the column or field you specified in your statement.
This error can happen when you execute any valid MySQL statements like a SELECT, INSERT, UPDATE, or ALTER TABLE statement.
This tutorial will help you fix the error by adjusting your SQL statements.
Let’s start with the SELECT statement.
Fix ERROR 1054 on a SELECT statement
To fix the error in your SELECT statement, you need to make sure that the column(s) you specified in your SQL statement actually exists in your database table.
Because the error above says that user_name column is unknown, let’s check the users table and see if the column exists or not.
To help you check the table in question, you can use the DESCRIBE or EXPLAIN statement to show your table information.
The example below shows the output of EXPLAIN statement for the users table:
mysql> EXPLAIN users;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| username | varchar(25) | NO | | | |
| display_name | varchar(50) | NO | | | |
| age | int | YES | | NULL | |
| comments | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
From the result above, you can see that the users table has no user_name field (column)
Instead, it has the username column without the underscore.
Knowing this, I can adjust my previous SQL query to fix the error:
SELECT username FROM users;
That should fix the error and your SQL query should show the result set.
Fix ERROR 1054 on an INSERT statement
When you specify column names in an INSERT statement, then the error can be triggered on an INSERT statement because of a wrong column name, just like in the SELECT statement.
First, you need to check that you have the right column names in your statement.
Once you are sure, the next step is to look at the VALUES() you specified in the statement.
For example, when I ran the following statement, I triggered the 1054 error:
mysql> INSERT INTO users(username, display_name)
-> VALUES ("jackolantern", Jack);
ERROR 1054 (42S22): Unknown column 'Jack' in 'field list'
The column names above are correct, and the error itself comes from the last entry in the VALUES() function.
The display_name column is of VARCHAR type, so MySQL expects you to insert a VARCHAR value into the column.
But Jack is not a VARCHAR value because it’s not enclosed in a quotation mark. MySQL considers the value to be a column name.
To fix the error above, simply add a quotation mark around the value. You can use both single quotes or double quotes as shown below:
INSERT INTO users(username, display_name)
VALUES ("jackolantern", 'Jack');
Now the INSERT statement should run without any error.
Fix ERROR 1054 on an UPDATE statement
To fix the 1054 error caused by an UPDATE statement, you need to look into the SET and WHERE clauses of your statement and make sure that the column names are all correct.
You can look at the error message that MySQL gave you to identify where the error is happening.
For example, the following SQL statement:
UPDATE users
SET username = "jackfrost", display_name = "Jack Frost"
WHERE user_name = "jackolantern";
Produces the following error:
ERROR 1054 (42S22): Unknown column 'user_name' in 'where clause'
The error clearly points toward the user_name column in the WHERE clause, so you only need to change that.
If the error points toward the field_list as shown below:
ERROR 1054 (42S22): Unknown column 'displayname' in 'field list'
Then you need to check on the SET statement and make sure that:
- You have the right column names
- Any
stringtype values are enclosed in a quotation mark
You can also check on the table name that you specified in the UPDATE statement and make sure that you’re operating on the right table.
Next, let’s look at how to fix the error on an ALTER TABLE statement
Fix ERROR 1054 on an ALTER TABLE statement
The error 1054 can also happen on an ALTER TABLE statement.
For example, the following statement tries to rename the displayname column to realname:
ALTER TABLE users
RENAME COLUMN displayname TO realname;
Because there’s no displayname column name in the table, MySQL will respond with the ERROR 1054 message.
Conclusion
In short, ERROR 1054 means that MySQL can’t find the column name that you specified in your SQL statements.
It doesn’t matter if you’re writing an INSERT, SELECT, or UPDATE statement.
There are only two things you need to check to fix the error:
- Make sure you’ve specified the right column name in your statement
- Make sure that any value of
stringtype in your statement is surrounded by a quotation mark
You can check on your table structure using the DESCRIBE or EXPLAIN statement to help you match the column name and type with your statement.
And that’s how you fix the MySQL ERROR 1054 caused by your SQL statements.
I hope this tutorial has been useful for you 🙏
I’ve created an database with 5 tables and each of the tables have various rows and columns as data.
When I try to select some of that data, I’m getting that error in the title and I have no idea how to do it otherwise!!
Here’s the thing:
Tables_in_table01
Afdeling
Apparaat
Leverancier
Medewerkers
Onderhoud
Those are the tables my database consist of and these are the definitions:
Afdeling = AfdelingNR + AfdelingNaam + Medewerkers_MedewerkerNR
Leverancier = LeverancierNR + Naam + Contactpersoon + Adres + Telefoon + Email
Apparaat = ApparaatNR + AfdelingNR + Aanschafdatum + Leverancier_LeverancierNR + Onderhoudtermijn + Afschrijvingsdatum
Medewerkers = MedewerkerNR + Geslacht + Functie + Voorletters + Tussenvoegsel + Achternaam + Beeper
Onderhoud = OnderhoudNR + Medewerker_MedewerkerNR + Apparaat_ApparaatNR
When I try to select the following:
SELECT MedewerkerNR, Voorletters, Tussenvoegsel, Achternaam
FROM Medewerkers
WHERE Medewerkers.MedewerkerNR=Afdeling.Medewerkers_MedewerkerNR
AND Afdeling.AfdelingNR=Apparaat.AfdelingNR;
It says:
Error 1054 (42S22): Unknown column
‘Afdeling.Medewerkers_MedwerkerNR’ in ‘where clause’
Why is this column unknown? I’ve checked it and the data does exist in the table..
After using SHOW CREATE TABLE Afdeling;
I’ve gotten the following:
mysql> SHOW CREATE TABLE Afdeling;
+----------+--------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------------------------------------+
| Table | Create Table
|
+----------+--------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------------------------------------+
| Afdeling | CREATE TABLE `afdeling` (
`AfdelingNR` varchar(8) NOT NULL,
`AfdelingNaam` varchar(45) DEFAULT NULL,
`Medewerkers_MedewerkerNR` decimal(8,0) NOT NULL,
PRIMARY KEY (`AfdelingNR`),
KEY `Afdeling_FKIndex1` (`Medewerkers_MedewerkerNR`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+--------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------------------------------------+
1 row in set (0.03 sec)
Any help is greatly accepted!
Cheers!
Доброго времени суток. При выполнении запроса выдает ошибку [Err] 1054 — Unknown column ‘stitle.subcat’ in ‘where clause’
UPDATE ad_copy, (SELECT CONCAT_WS(" - ", ad_copy.title, stitle.ttitle) AS `p` from ad_copy, stitle
where ad_copy.category = stitle.subcat ORDER BY RAND()) `p` set `title` = `p` where ad_copy.category = stitle.subcat
Суть — запрос должен брать данные из одной таблицы и дополнять уже имеющиеся данные ими. Заранее спасибо за помощь!
-
Вопрос заданболее трёх лет назад
-
5551 просмотр
Ошибка вполне понятна, во внешнем WHERE таблица stitle не определена, соответственно колонка stitle.subcat тоже.
Запрос несколько бредовый, ORDER BY RAND() — наихудший по скорости вариант, как правило можно обойтись без него. Лучше скажите, какой результат хотите получить.
UPDATE `ad_copy` AS `a`
LEFT JOIN (
SELECT `a`.`title`, (
SELECT `s`.`ttitle`
FROM `stitle` AS `s`
WHERE `a`.`category` = `s`.`subcat`
ORDER BY RAND()
LIMIT 1
) AS `ttitle`
FROM `ad_copy` AS `a`
) AS `s` USING(`title`)
SET `a`.`title` = CONCAT_WS(" - ", `a`.`title`, `s`.`ttitle`)
1. При каждом следующем запросе к ad_copy.title будет дописываться новое значение?
2. Если количество записей в каждой подкатегории небольшое, то ORDER BY RAND() не сильно скажется на производительности. Если большое — может оказаться, что лучше делать внешними средствами.
Пригласить эксперта
UPDATE
ad_copy a
JOIN stitle s ON (a.category = s.subcat)
SET a.`title` = CONCAT_WS( " - ",a.title,s.ttitle)
Сделал так. Мне надо чтобы в колонку ttitle добавлялось случайное значение из stitle…
-
Показать ещё
Загружается…
13 июн. 2023, в 11:44
400 руб./за проект
13 июн. 2023, в 11:15
5000 руб./за проект
13 июн. 2023, в 11:01
30000 руб./за проект
