2010-08-21 76 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