这是我的mysql查询.
SELECT s.s_nric AS nric,
s.s_name AS name,
s.s_psle_eng AS psle_eng,
s.s_psle_math AS psle_maths,
s.s_psle_aggr AS psle_aggr,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code LIKE 'FEEN%'
AND re.re_year = '2008'
AND re.re_semester = '2'
AND re.re_nric = s.s_nric) AS english_2008,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code LIKE 'FEMA%'
AND re.re_year = '2008'
AND re.re_semester = '2'
AND re.re_nric = s.s_nric) maths_2008,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code LIKE 'FEEN%'
AND re.re_year = '2009'
AND re.re_semester = '2'
AND re.re_nric = s.s_nric) AS english_2009,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code LIKE 'FEMA%'
AND re.re_year = '2009'
AND re.re_semester = '2'
AND re.re_nric = s.s_nric) maths_2009,
isc.isc_g_gpa AS isc_gpa
FROM si_student_data AS s
LEFT JOIN si_isc_gpa AS isc
ON isc.isc_g_nric = s.s_nric
WHERE 1 = 1
AND s.s_admission_year = '2008'
GROUP BY s.s_nric
ORDER BY s.s_gender,
s.s_name ASC
Run Code Online (Sandbox Code Playgroud)
请检查我的子查询
这是我的子查询
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code like 'FEEN%'
AND re.re_year='2008'
AND re.re_semester='2'
AND re.re_nric=s.s_nric) as English_2008,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code like 'FEMA%'
AND re.re_year='2008'
AND re.re_semester='2'
AND re.re_nric=s.s_nric) Maths_2008,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code like 'FEEN%'
AND re.re_year='2009'
AND re.re_semester='2'
AND re.re_nric=s.s_nric ) as English_2009,
(SELECT re.re_mark
FROM si_results re
WHERE re.re_code like 'FEMA%'
AND re.re_year='2009'
AND re.re_semester='2'
AND re.re_nric=s.s_nric ) Maths_2009
Run Code Online (Sandbox Code Playgroud)
当我执行查询时,服务器需要很长时间才能执行.那怎么简单呢?请指教.
谢谢.
重要的是要知道,LIKE 'XXXX%'如果没有索引,那么做一个非常慢.在某些情况下,这可能需要永远.此外,你正在做四个子选择而不是连接,这又慢了.下面我添加了一个完整的查询,它将产生相同的结果.替代方法是通过减少连接数来减小查询的大小,而是使用NORMALIZED输出.这适用于每一个nric,name你将拥有多行而不是re_mark每种类型的类(英语,数学,2008年,2009年等),你将有两列包含代码(FEEN或FEMA)和标记.
尝试以下查询,看看它是否适合您:
SELECT s.s_nric AS nric,
s.s_name AS name,
s.s_psle_eng AS psle_eng,
s.s_psle_math AS psle_maths,
s.s_psle_aggr AS psle_aggr,
e_2008_feen.re_mark AS english_2008,
e_2008_fema.re_mark AS maths_2008,
e_2009_feen.re_mark AS english_2009,
e_2009_fema.re_mark AS maths_2009,
isc.isc_g_gpa AS isc_gpa
FROM si_student_data AS s
INNER JOIN si_results e_2008_feen
ON e_2008_feen.re_code LIKE 'FEEN%'
AND e_2008_feen.re_year = '2008'
AND e_2008_feen.re_semester = '2'
AND e_2008_feen.re_nric = s.s_nric
INNER JOIN si_results e_2008_fema
ON e_2008_fema.re_code LIKE 'FEMA%'
AND e_2008_fema.re_year = '2008'
AND e_2008_fema.re_semester = '2'
AND e_2008_fema.re_nric = s.s_nric
INNER JOIN si_results e_2009_feen
ON e_2009_feen.re_code LIKE 'FEEN%'
AND e_2009_feen.re_year = '2009'
AND e_2009_feen.re_semester = '2'
AND e_2009_feen.re_nric = s.s_nric
INNER JOIN si_results e_2009_fema
ON e_2009_fema.re_code LIKE 'FEMA%'
AND e_2009_fema.re_year = '2009'
AND e_2009_fema.re_semester = '2'
AND e_2009_fema.re_nric = s.s_nric
LEFT JOIN si_isc_gpa AS isc
ON isc.isc_g_nric = s.s_nric
WHERE s.s_admission_year = '2008'
GROUP BY s.s_nric
ORDER BY s.s_gender,
s.s_name ASC
Run Code Online (Sandbox Code Playgroud)
编辑:包括标准化版本:
SELECT s.s_nric AS nric,
s.s_name AS name,
s.s_psle_eng AS psle_eng,
s.s_psle_math AS psle_maths,
s.s_psle_aggr AS psle_aggr,
si_results.re_code AS code
si_results.re_mark AS mark
si_results.re_year AS year
isc.isc_g_gpa AS isc_gpa
FROM si_student_data AS s
INNER JOIN si_results e_2008_feen
ON si_results.re_nric = s.s_nric
LEFT JOIN si_isc_gpa AS isc
ON isc.isc_g_nric = s.s_nric
WHERE s.s_admission_year = '2008'
AND si_results.re_year in ('2008', '2009')
AND si_results.re_semester = '2'
AND (
si_results.re_code LIKE 'FEEN%'
OR si_results.re_code LIKE 'FEMA%'
)
GROUP BY s.s_nric
ORDER BY s.s_gender,
s.s_name ASC
Run Code Online (Sandbox Code Playgroud)
这将产生如下行:
nric: 1
name: 'student 1'
psle_eng: eng1
psle_maths: maths1
psle_aggr: aggr1
code: FEENXXXX
mark: 5
year: 2008
isc_gpa: gpa1
nric: 1
name: 'student 1'
psle_eng: eng1
psle_maths: maths1
psle_aggr: aggr1
code: FEENXXXX
mark: 3
year: 2009
isc_gpa: gpa1
nric: 1
name: 'student 1'
psle_eng: eng1
psle_maths: maths1
psle_aggr: aggr1
code: FEMAXXXX
mark: 4.5
year: 2008
isc_gpa: gpa1
nric: 1
name: 'student 1'
psle_eng: eng1
psle_maths: maths1
psle_aggr: aggr1
code: FEMAXXXX
mark: 5
year: 2009
isc_gpa: gpa1
Run Code Online (Sandbox Code Playgroud)
请注意,改变了四个记录的唯一值是code,mark和year.你将获得4倍的记录数量,但它的运行速度也应该比之前快得多.您的代码必须迭代所有行并根据需要聚合它们.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |