Что не так с моим синтаксисом MySQL в этом запросе?

#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' ;