2

我有以下查询:

SELECT 
    users.*,
    classes.*, 
    evaluation.student_id, 
    evaluation.class_id, 
    evaluation.chapter_title,
    (SELECT
        `score`
     FROM 
        `evaluation`
     WHERE 
        `class_id` = 1 
     AND 
        `id` 
     IN
        (SELECT 
            MAX(`id`)
         FROM
            `evaluation`
         WHERE
            `class_id` = 1
         GROUP BY
            `chapter_title`)
     GROUP BY
        `chapter_title`) 
     AS
        `score`,
     (SELECT
        `total_score`
      FROM
        `evaluation`
      WHERE
        `class_id` = 1
      AND
        `id`
      IN
        (SELECT 
            MAX(`id`)
         FROM
            `evaluation`
         WHERE
            `class_id` = 1
         GROUP BY
            `chapter_title`)
      GROUP BY
         `chapter_title`)
      AS
         `total_score`
      FROM
        (`evaluation`
      INNER JOIN
        `users`
      ON 
        evaluation.student_id=users.id)
      INNER JOIN
        `classes`
      ON
        evaluation.class_id=classes.id
      WHERE
        users.role='student'
      AND
        evaluation.class_id = 1
      AND
        evaluation.student_id = 8

但是当我在 phpmyadmin 中执行此查询时,它会显示一条错误消息:

#1242 - Subquery returns more than 1 row

查询中有什么问题。请帮忙。提前致谢。

我有这个表:

用户 在此处输入图像描述

班级 在此处输入图像描述

评估 在此处输入图像描述

在评估表中(最后一张图片)..我只想返回一个不同的 chapter_title 或一个分组的 chapter_title,它具有最高的 id 并且学生 ID 为 8。

我需要使用这个查询......但返回一个错误。

4

4 回答 4

2

问题是您的两个查询都返回多条记录:

SELECT `score`
     FROM `evaluation`
     WHERE `class_id` = 1 
       AND `id` IN (SELECT  MAX(`id`)
                     FROM `evaluation`
                     WHERE `class_id` = 1
                     GROUP BY `chapter_title`)
     GROUP BY `chapter_title`;

SELECT `total_score`
      FROM `evaluation`
      WHERE `class_id` = 1
        AND `id` IN (SELECT  MAX(`id`)
                     FROM `evaluation`
                     WHERE `class_id` = 1
                     GROUP BY `chapter_title`)
      GROUP BY`chapter_title`;

请参阅带有演示的 SQL Fiddle

我将您的查询稍微更改为以下内容:

SELECT u.*,
    c.*, 
    e.student_id, 
    e.class_id, 
    e.chapter_title,
    (SELECT `score`
     FROM `evaluation` e1
     WHERE `class_id` = 1 
       AND e.id = e1.id
       AND `id` IN (SELECT  MAX(`id`)
                     FROM `evaluation`
                     WHERE `class_id` = 1
                     GROUP BY `chapter_title`)
     GROUP BY `chapter_title`)  AS`score`,
     (SELECT `total_score`
      FROM `evaluation` e1
      WHERE `class_id` = 1
        AND e.id = e1.id
        AND `id` IN (SELECT  MAX(`id`)
                     FROM `evaluation`
                     WHERE `class_id` = 1
                     GROUP BY `chapter_title`)
      GROUP BY`chapter_title`) AS `total_score`
FROM `evaluation` e
INNER JOIN `users` u
  ON e.student_id=u.id
INNER JOIN `classes` c
  ON e.class_id=c.id
WHERE u.role='student'
  AND e.class_id = 1
  AND e.student_id = 8

请参阅带有演示的 SQL Fiddle

于 2012-10-23T15:19:02.703 回答
1

这是更正的小提琴

SELECT
    users.*,
    classes.*,
    evaluation.student_id,
    evaluation.class_id,
    evaluation.chapter_title,
    evaluation.score,
    evaluation.total_score
 FROM
    evaluation
 INNER JOIN users
 ON
    evaluation.student_id=users.id
  INNER JOIN
    classes
  ON
    evaluation.class_id=classes.id
  WHERE
    users.role='student'
  AND
    evaluation.class_id = 1
  AND
    evaluation.student_id = 8
 AND
 EXISTS
    (SELECT
        *
     FROM
        evaluation
     WHERE
        class_id = 1
    HAVING MAX(id) = evaluation.id)
 GROUP BY
    chapter_title

主要变化:

  1. 而不是IN,使用EXISTS(应该更快,因为它不需要返回所有子行);

  2. 不需要一些子查询。

于 2012-10-23T15:16:22.257 回答
1

您需要LIMIT 1在所有子查询上使用,以确保只返回一个值。

例如

select users.*, classes.*, evaluation.student_id, evaluation.class_id, evaluation.chapter_title, (
        select `score`
        from `evaluation`
        where `class_id` = 1
            and `id` in (
                select MAX(`id`)
                from `evaluation`
                where `class_id` = 1
                group by `chapter_title`
                )
        group by `chapter_title`
        limit 1
        ) as `score`, (
        select `total_score`
        from `evaluation`
        where `class_id` = 1
            and `id` in (
                select MAX(`id`)
                from `evaluation`
                where `class_id` = 1
                group by `chapter_title`
                )
        group by `chapter_title`
        limit 1
        ) as `total_score`
from (
    `evaluation` inner join `users` on evaluation.student_id = users.id
    )
inner join `classes` on evaluation.class_id = classes.id
where users.role = 'student'
    and evaluation.class_id = 1
    and evaluation.student_id = 8
于 2012-10-23T14:33:58.940 回答
0

您的SELECT scores子查询(第一个)很可能返回不止一行。它是唯一没有在IN()子句中使用的,其结果作为父查询中的字段返回。由于它“返回”到一个字段,它必须产生一个单值+单行结果集。

于 2012-10-23T14:34:59.880 回答