#mysql #sql
#mysql #sql
Вопрос:
В моей таблице с именем ‘Component’ я пытаюсь запросить элементы, которые имеют ‘lifeCycleStatus’ Active с определенным ‘EndOfLifeDate’.
Вот описание моей таблицы.
mysql> describe component;
----------------- -------------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
----------------- -------------- ------ ----- --------- -------
| componentID | varchar(20) | NO | PRI | NULL | |
| vendorName | varchar(255) | YES | | NULL | |
| Family | varchar(100) | YES | | NULL | |
| cdescription | varchar(255) | YES | | NULL | |
| CategoryType | varchar(255) | YES | | NULL | |
| endOfSaleDate | varchar(20) | YES | | NULL | |
| endOfLifeDate | varchar(20) | YES | | NULL | |
| LifeCycleStatus | varchar(20) | YES | | NULL | |
----------------- -------------- ------ ----- --------- -------
8 rows in set (0.00 sec)
И вот мой запрос с ошибкой.
mysql> SELECT C.vendorName
-> FROM Component C
-> GROUP BY C.LifecycleStatus
-> HAVING EndOfLifeDate = '4/30/2024' ;
ERROR 1054 (42S22): Unknown column 'EndOfLifeDate' in 'having clause'
Что я делаю не так?
Комментарии:
1. Пробовали использовать строчную букву e в начале, как показано в описании таблицы?
2. Что вы могли бы попытаться сделать? Запрос имеет непоследовательное использование столбцов в
SELECT
,GROUP BY
, иHAVING
. И модель данных тоже искажена, используя строки вместоdate
.3. Какой смысл группировать ПО, если вы не выполняете никакой агрегации?
Ответ №1:
Использовать WHERE
, а не HAVING
:
SELECT C.vendorName
FROM Component C
WHERE endOfLifeDate = '4/30/2024'
GROUP BY C.vendorName;
HAVING
вычисляется после GROUP BY
, поэтому он должен использовать только GROUP BY
ключи и выражения с функциями агрегирования.
Примечание: это также исправляет GROUP BY
, чтобы он соответствовал SELECT
столбцам.
Затем исправьте свою модель данных. Вы не должны хранить даты в виде строк. Они должны храниться как date
. Для этого и предназначен тип данных.
Ответ №2:
Ваш запрос :
mysql> SELECT C.vendorName
-> FROM Component C
-> GROUP BY C.LifecycleStatus
-> HAVING EndOfLifeDate = '4/30/2024' ;
ERROR 1054 (42S22): Unknown column 'EndOfLifeDate' in 'having clause'
HAVING работает с выбранными вами столбцами или столбцами, к которым вы применили group by.
Вы можете попробовать это ,
mysql> SELECT C.vendorName , C.EndOfLifeDate
-> FROM Component C
-> GROUP BY C.LifecycleStatus
-> HAVING C.EndOfLifeDate = '4/30/2024' ;