Альтернатива Mysql для LIMIT внутри подзапроса в MySQL 5.1.49 - PullRequest
4 голосов
/ 21 августа 2010
SELECT student_id FROM `students` AS s1
WHERE student_id IN 
  (SELECT s2.student_id FROM `students` AS s2
     WHERE s1.year_of_birth = s2.year_of_birth
     LIMIT 10)

Не могу обработать этот запрос на моем сервере.Он сбрасывает ошибки, что говорит о том, что эта версия mysql не поддерживает ограничение внутри подзапросов и т. Д. (ОШИБКА 1235).

Есть ли решение для моей версии mysql 5.1.49?1006 * Благодаря Марк Байерс

1 Ответ

4 голосов
/ 21 августа 2010

Я думаю, вам нужны десять учеников с каждой датой рождения. Это самый большой запрос для каждой группы, и вы можете выполнить поиск переполнения стека , чтобы увидеть, как это можно сделать в MySQL.

Было бы легко, если бы MySQL поддерживал функцию ROW_NUMBER, но, поскольку она не поддерживает ее, вы можете эмулировать ее с помощью переменных. Например, чтобы получить 3 ученика на каждую дату рождения, вы можете сделать это так:

SELECT
    student_id,
    year_of_birth
FROM (
    SELECT
        year_of_birth,
        student_id,
        @rn := CASE WHEN @prev_year_of_birth = year_of_birth
                    THEN @rn + 1
                    ELSE 1
               END AS rn,
        @prev_year_of_birth := year_of_birth
    FROM (SELECT @prev_year_of_birth := NULL) vars, students T1
    ORDER BY year_of_birth, student_id DESC
) T2
WHERE rn <= 3
ORDER BY year_of_birth, student_id

Результат:

1, 1990
2, 1990
5, 1990
4, 1991
7, 1991
8, 1991
6, 1992

Данные испытаний:

CREATE TABLE students (student_id INT NOT NULL, year_of_birth INT NOT NULL);
INSERT INTO students (student_id, year_of_birth) VALUES
(1, 1990),
(2, 1990),
(3, 1991),
(4, 1991),
(5, 1990),
(6, 1992),
(7, 1991),
(8, 1991);
...