Как написать решение с несколькими запросами как один запрос в MySQL - PullRequest
0 голосов
/ 22 декабря 2018

Моя задача состоит в том, чтобы найти всех тех предметов по их идентификатору, которые имеют (по крайней мере один, но) наименьшее количество самых низких проходных баллов в базе данных (оценка составляет 6 класс).Мне удалось написать решение с тремя запросами, однако моя задача - написать его как один запрос в MySQL.Заранее спасибо.

-- 1. single query "solution"
SELECT subject_id FROM (SELECT subject_id, COUNT(*) AS six_count 
FROM exams WHERE grade = 6
GROUP BY subject_id) AS sixes
WHERE subject_id = (SELECT MIN(six_count) FROM sixes);

-- 2. multiple queries solution
CREATE TABLE sixes AS (SELECT subject_id, COUNT(*) AS six_count 
FROM exams WHERE grade = 6
GROUP BY subject_id);

SELECT subject_id FROM sixes
WHERE subject_id = (SELECT MIN(six_count) FROM sixes);

DROP TABLE sixes;

РЕДАКТИРОВАТЬ: Пример таблицы экзаменов:

| subject_id | student_id | exam_year | exam_mark | grade | exam_date  |
|          1 |    20100022|      2011 |     'apr' |    10 | 2011-04-11 |
|          2 |    20100055|      2011 |     'oct' |     6 | 2011-10-04 |
|          3 |    20110030|      2011 |    'jan1' |     7 | 2011-01-26 |
|          5 |    20110055|      2011 |    'jan2' |     6 | 2011-02-13 |
|          5 |    20110001|      2011 |    'jun1' |     8 | 2011-06-23 |

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Этот шаблон должен помочь.Обобщенные имена.

SELECT subjectID
  FROM TEST_DATA
 WHERE grade = 6
 GROUP
    BY SubjectID
HAVING COUNT(1) = 
         (  SELECT count(1) AS minCount
              FROM TEST_DATA
             WHERE grade = 6
             GROUP 
                BY subjectID
             ORDER
                BY minCount 
             LIMIT 1
         );
0 голосов
/ 22 декабря 2018

Это должно сработать.Подзапрос выбирает первое наименьшее число шестерок.Основной запрос выбирает все предметы с этим номером.Хитрость в ORDER BY count(*) LIMIT 1, что заставляет подзапрос возвращать запись с наименьшим количеством.

SELECT
  subject_id,
  count(*) as six_count
FROM exams
WHERE grade = 6
GROUP BY subject_id
HAVING count(*) = 
  ( SELECT count(*)
    FROM exams
    WHERE grade = 6
    GROUP BY subject_id
    ORDER BY count(*)
    LIMIT 1
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...