MySQL 공식 홈페이지의 답변을 참조한 결과, Incorrect number of columns from subquery:
라는 답변을 확인할 수 있었다.
SELECT (SELECT column1, column2 FROM t2) FROM t1;
You may use a subquery that returns multiple columns, if the purpose is row comparison. In other contexts, the subquery must be a scalar operand.
그리고 나서, Row SubQuery 에 대해 알아볼 수 있는 해당 문서를 안내해주어 들어가서 알아보았다.
Scalar or column subqueries return a single value or a column of values. A row subquery is a subquery variant that returns a single row and can thus return more than one column value.
행, 혹은 열에 대한 SubQuery 는 단일 값 혹은 값들의 column 들을 반환한다. 행에 대한 SubQuery 는 1개의 row, 그리고 1개 이상의 column value 를 반환할 수 있다고 한다.
"피연산자는 1개 이상의 column 을 가지고 있어야 한다" 라는 의미이다.
ORM으로 추상화가 되어있는 상황인지라, 어떤 상황에서 어떤 Query 가 날아가는 지를 몰랐다. 그래서 날아가는 Query 로그를 반환해야겠다는 생각에, 사용하는 TypeORM 의 Connection Options 단락에 들어가, logging
property 를 참조해 logging option 을 추가하였다.
// ...
write: {
name: 'write',
...devBaseOption,
port: parseInt(process.env.LOCAL_DB_WRITE_PORT, 10),
host: process.env.LOCAL_DB_HOST,
synchronize: true,
migrationsRun: true,
logging: true,
},
// ...
# query failed:
SELECT `DrivingKeyword`.`driving_keyword_id` AS `DrivingKeyword_driving_keyword_id`,
`DrivingKeyword`.`category` AS `DrivingKeyword_category`,
`DrivingKeyword`.`name` AS `DrivingKeyword_name`
FROM `driving_keyword` `DrivingKeyword`
WHERE (`DrivingKeyword`.`driving_keyword_id` = ?)
OR (`DrivingKeyword`.`driving_keyword_id` = ?)
OR (`DrivingKeyword`.`driving_keyword_id` = ?)
OR (`DrivingKeyword`.`driving_keyword_id` = ?)
OR (`DrivingKeyword`.`driving_keyword_id` = ?)
# -- PARAMETERS: [1,4,11,13,[11,13]]
Query 자체는 문제가 없어 보인다. 문제는 Parameter 인데, 배열을 flat 하게 만든다고 해서 만든 것이, 저런 식으로 [1,4,11,13,[11,13]]
nested 구조로 이뤄져 있었다.