[21000] [1242]子查询返回多于1行

时间:2020-05-12 18:40:49

标签: mysql sql hibernate hql

我的查询:

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")

这是我收到的错误-[21000] [1242]子查询返回的行多于1

通过异常方法,我确定此查询字符串中的错误:

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

如何发出正确的请求,以免出现此错误?谢谢!

3 个答案:

答案 0 :(得分:0)

子查询返回多于1行,这仅表示您的查询未返回一行以使外部select语句起作用。

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

您必须应用一组条件来唯一地过滤数据,或使用联接将表的Answer和Question组合在一起,然后相应地过滤数据。

您还可以通过GROUP_CONCAT Mysql函数将每一行数据分组为一列,如下所示:

"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "

尽管GROUP_CONCAT在Mysql中不可用,因为您还可以按照本post中的说明在休眠模式下绑定SQL函数。

答案 1 :(得分:0)

两种常见的方式是聚集和限制:

(SELECT MAX(a.isHelpful) FROM Answer a WHERE a.question.id = q.id)
(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id LIMIT 1)

但是,这些实际上只是黑客解决数据的“问题”。我用引号括起来,但真正的问题可能是您对数据的理解,而不是数据本身。

您应该了解为什么重复。然后决定您想要哪个值。并根据您的需要实施正确的逻辑。

答案 2 :(得分:0)

经过一天的反复试验,我找到了以下解决方案,希望有人能开阔视野并帮助解决他们的问题:

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")