[21000][1242] Subquery returns more than 1 row
Вот так выглядит мой запрос SQL:
entityManager.createQuery("SELECT " +
"q.id, " +
"q.title, " +
"q.user.fullName, " +
"q.user.reputationCount, " +
"q.viewCount, " +
"q.countValuable, " +
"q.persistDateTime, " +
"t.id, " +
"t.name, " +
"t.description, " +
"(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) " +
"FROM Question q JOIN q.tags t")
Методом исключений определил что ошибка вылетает на этой строке:
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
Пишет - [21000][1242] Subquery returns more than 1 row, гуглим что только можно, разные решения уже есть, но все очень индивидуально, что не так в этой строке?
Ответы (2 шт):
если вам всё равно, какое из нескольких значений, что вернёт подзапрос, использовать - можно добавить в него
(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id limit 1), если это значение можно подогнать под 1 сортировками, то order by a.isHelpful desc или не desc
возвращает подзапрос несколько значений потому что в Answer есть несколько a.question.id равных q.id и подозреваю, что вы об этом знаете, раз делаете вот это - (SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id) иначе эта вставка бессмысленна, так как если второй подзапрос должен возвращать один результат, то и этот всегда будет возвращать 1.
так же можно использовать так, чтобы понять больше (так несколько значений склеятся в одно и результат по любому будет 1, но склеен из нескольких подходящих) -
SELECT group_concat(a.isHelpful) FROM Answer a WHERE a.question.id = q.id
Может кому-то пригодится - я нашел такое решение, сильно голову конечно пришлось поломать, надеюсь кому-то упростит это жизнь:
entityManager.createQuery("SELECT " +
"q.id, " +
"q.title, " +
"q.user.fullName, " +
"q.user.reputationCount, " +
"q.viewCount, " +
"q.countValuable, " +
"q.persistDateTime, " +
"t.id, " +
"t.name, " +
"t.description, " +
"(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
"(SELECT CASE WHEN MAX (a.isHelpful) > 0 THEN true ELSE false END FROM Answer a WHERE a.question.id = q.id) " +
"FROM Question q JOIN q.tags t")