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

クエリが間違っています。助けてください。前もって感謝します。

私はこのテーブルを持っています:

ユーザー ここに画像の説明を入力

クラス ここに画像の説明を入力

評価 ここに画像の説明を入力

評価テーブル(最後の画像)で.私は、最高のIDを持ち、8のstudent_idを持つ個別のchapter_titleまたはグループ化されたchapter_titleのみを返したいと思います.

このクエリを使用する必要がありましたが、エラーが返されます。

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値が 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 に答える