簡體   English   中英

MySQL子查詢未知列用於復雜查詢

[英]MySQL subquery unknown column for complex query

我有以下sqlfiddle http://sqlfiddle.com/#!2/324628/1

我需要創建一個查詢,該查詢返回班級中每個學生的ID和位置(排名); 根據存儲在academic_averages表中的學術平均值的值,該排名以降序排列。

(例如,第1類來自第一個,第二類來自第1,依此類推...第一個來自第2類,第二個來自第2類...)

這是查詢:

SELECT students.id,

(SELECT x.position
FROM (
    SELECT t.student_id, t.value, @rownum := @rownum + 1 AS position
    FROM (
        SELECT aa.student_id, aa.value
        FROM academic_averages AS aa
        INNER JOIN students AS s ON s.id = aa.student_id
        INNER JOIN classes_students AS cs ON cs.student_id = s.id
        INNER JOIN classes_academic_years AS cas ON cas.id = cs.class_academic_year_id

        INNER JOIN classes_academic_years as cas2 on cas2.class_id = cas.class_id
        INNER JOIN classes_students as cs2 on cs2.class_academic_year_id = cas2.id
        INNER JOIN students as s2 on s2.id = cs2.student_id

        WHERE s2.id = 243
        AND cas.academic_year_id = 4
        AND aa.academic_year_id = 4

        GROUP BY aa.student_id
        ORDER BY abs(aa.value) DESC
    ) t 
    JOIN (SELECT @rownum := 0) r 
) AS x WHERE x.student_id = students.id ) AS ranking_by_class

FROM students

但是,由於它包含一個子查詢,因此我無法將WHERE從最里面的查詢更改為s2.id = students.id因為它會引發錯誤(未知列)。

我試過使用INNER JOIN代替子查詢,但是到目前為止還沒有運氣。

有沒有人有辦法解決嗎?

謝謝

LE:在性能方面,必須優化查詢

LE:這是表格的結構:

學術平均

id
student_id
value
academic_year_id

classes_academic_years

id
class_id
name
grade
academic_year_id

classes_students

id
class_academic_year_id
student_id

id
school_id

學生

id

所需的輸出應為student_id, position sql小提琴似乎存在一些問題,同時這里是模式: http : //snippi.com/s/db8za8k

SELECT x.id
  , x.position
  , x.academic_average
FROM (SELECT
  s.id
  , @rownum := @rownum + 1 position
  , av.value academic_average
FROM students s
JOIN classes_students cs ON s.id = cs.student_id 
JOIN classes_academic_years cay ON cay.id = cs.class_academic_year_id
JOIN academic_averages av ON av.student_id = s.id
WHERE cay.academic_year_id = 4 -- change these two parameters in    
  AND  av.academic_year_id = 4 -- the subquery for different years
ORDER BY av.value DESC) x,
(SELECT @rownum := 0) y
ORDER BY academic_average DESC

我認為上面的查詢應該為您工作。

我假設學術排名position由學術平均水平降序確定。

我無權訪問您的數據集,因此我添加了三行,兩行選擇學生的學業平均值,一行根據學業成績以降序排列結果。 這應該可以幫助您驗證它是否按預期工作。 如果您運行查詢,並且該查詢有效,它將顯示position從1開始並以1遞增的記錄。

在生產中,我將省略這些片段以獲取您指定的結果集:
1. , x.academic_average
2. , av.value academic_average
3.按ORDER BY academic_average DESC

根據OP對評論進行詳細說明(按班級要求對學生的排名)

該查詢應按班級為您提供學生的職位。 如果要擺脫某些字段,可以將SELECT包裝在另一個SELECT ,或者在將數據集提取為另一種語言后忽略這些列。

SELECT 
    x.student_id
  , x.cay_class_id
  , x.academic_average
  , if(@classid = x.cay_class_id, @rownum := @rownum + 1, @rownum := 1) position
  , @classid := x.cay_class_id
FROM (SELECT
    s.id student_id
  , cay.class_id cay_class_id
  , av.value academic_average

FROM students s
JOIN classes_students cs ON s.id = cs.student_id 
JOIN classes_academic_years cay ON cay.id = cs.class_academic_year_id
JOIN academic_averages av ON av.student_id = s.id
WHERE cay.academic_year_id = 4 -- change these two parameters in    
  AND  av.academic_year_id = 4 -- the subquery for different years
ORDER BY cay.class_id, av.value DESC) x,
(SELECT @classid := 0, @rownum := 0) y

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM