2010-08-21 1 views
4
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 не поддерживает ограничение внутри подзапросов и т. Д. (ERROR 1235).Альтернатива Mysql для LIMIT внутри подзапроса в mysql 5.1.49

Есть ли решение для моей версии mysql 5.1.49?

SELECT 
    id, 
    region 
FROM (
    SELECT 
     region, 
     id, 
     @rn := CASE WHEN @prev_region = region 
        THEN @rn + 1 
        ELSE 1 
       END AS rn, 
     @prev_region := region 
    FROM (SELECT @prev_region := NULL) vars, ads T1 
    ORDER BY region, id DESC 
) T2 
WHERE rn <= 4 
ORDER BY region, id 

Благодаря Марка Байерса

+0

Вот обходной путь, не может скажите, как хорошо это сработает, но попробуйте: http://lists.mysql.com/mysql/211239 –

+0

Можете ли вы объяснить, что именно вы пытаетесь сделать словами? Или с обработанным примером с примером ввода и ожидаемого вывода. –

+0

Должна быть та же техника, что и другой вопрос, который вы только что задали. Http://stackoverflow.com/questions/3537987/mysql-access-main-table-inside-right-joined-subquery –

ответ

4

Я думаю, что вы хотите любых десять студентов с каждой датой рождения. Это запрос наибольший-n-на группу, и вы можете search Stack Overflow посмотреть, как это можно сделать в 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); 
+0

erm на самом деле он должен выбрать 10 строк для каждой даты рождения – Somebody

+0

ну на самом деле мне нужно выбрать 4 строки для каждого «независимо» – Somebody

+1

Вам просто нужно изменить число от 3 до 10 (или 4) в строке 'WHERE rn <= 3 '. –

 Смежные вопросы

  • Нет связанных вопросов^_^