2010-08-21 46 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不支持子查询等内部的限制(错误1235)。Mysql替代MySQL中的子查询中的LIMIT 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 – 2010-08-21 15:12:33

+0

你能用文字解释你想要做什么吗?或者带有示例输入和预期输出的工作示例。 – 2010-08-21 15:19:22

+0

应该是与你刚刚问过的其他问题相同的技术http://stackoverflow.com/questions/3537987/mysql-access-main-table-inside-right-joined-subquery – 2010-08-21 15:21:34

回答

4

我想你想的任何十名学生每次的生日。这是一个最大的n-per-group查询,你可以通过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

其实它应该为每个出生日期选择10行 – Somebody 2010-08-21 15:19:51

+0

其实我需要为每个“无论”选择4行 – Somebody 2010-08-21 15:28:47

+1

您只需将行数从3改为10(或4)WHERE <= 3 '。 – 2010-08-21 15:37:49