2014-09-28 30 views
1

我已经叫表“汝来”和这里的展示基于最大(列)具体列结果的MySQL

mysql> select * from nilai; 
+------------+------+-----------------+-------+ 
| nim  | nama | matkul   | nilai | 
+------------+------+-----------------+-------+ 
| 0911500101 | ADI | ALGORITMA  | 90 | 
| 0911500101 | ADI | KALKULUS  | 65 | 
| 0911500101 | ADI | PBO    | 90 | 
| 0911500101 | ADI | PEMROGRAMAN WEB | 90 | 
| 0911500101 | ADI | PTI    | 75 | 
| 0911500102 | IDA | ALGORITMA  | 80 | 
| 0911500102 | IDA | KALKULUS  | 70 | 
| 0911500102 | IDA | PBO    | 80 | 
| 0911500102 | IDA | PEMROGRAMAN WEB | 85 | 
| 0911500102 | IDA | PTI    | 90 | 
| 0911500103 | EDI | ALGORITMA  | 85 | 
| 0911500103 | EDI | KALKULUS  | 60 | 
| 0911500103 | EDI | PBO    | 85 | 
| 0911500103 | EDI | PEMROGRAMAN WEB | 85 | 
| 0911500103 | EDI | PTI    | 88 | 
| 0911500104 | INA | ALGORITMA  | 75 | 
| 0911500104 | INA | KALKULUS  | 50 | 
| 0911500104 | INA | PBO    | 75 | 
| 0911500104 | INA | PEMROGRAMAN WEB | 80 | 
| 0911500104 | INA | PTI    | 72 | 
| 0911500105 | ANI | ALGORITMA  | 92 | 
| 0911500105 | ANI | KALKULUS  | 68 | 
| 0911500105 | ANI | PBO    | 80 | 
| 0911500105 | ANI | PEMROGRAMAN WEB | 92 | 
| 0911500105 | ANI | PTI    | 90 | 
+------------+------+-----------------+-------+ 
25 rows in set (0.00 sec) 

我想显示“MAX(汝来)”和“分钟(汝来)的全部内容“每个‘matkul’(中,英文科),所以我创建这样的查询它完美地工作:

mysql> select matkul, min(nilai), max(nilai) from nilai group by matkul; 
+-----------------+------------+------------+ 
| matkul   | min(nilai) | max(nilai) | 
+-----------------+------------+------------+ 
| ALGORITMA  |   75 |   92 | 
| KALKULUS  |   50 |   70 | 
| PBO    |   75 |   90 | 
| PEMROGRAMAN WEB |   80 |   92 | 
| PTI    |   72 |   90 | 
+-----------------+------------+------------+ 
5 rows in set (0.03 sec) 

但该查询只显示MAX(汝来)和最小(汝来)没有表现出谁max(nilai)和min(nilai)属于这样的最终结果将是这样的

+-----------------+------------+------------+----------------+----------------+ 
| matkul   | min(nilai) | max(nilai) | min belongs to | max belongs to | 
+-----------------+------------+------------+----------------+----------------+ 
| ALGORITMA  |   75 |   92 |   INA |   ANI | 
| KALKULUS  |   50 |   70 |   INA |   IDA | 
| PBO    |   75 |   90 |   INA |   ADI | 
| PEMROGRAMAN WEB |   80 |   92 |   INA |   ANI | 
| PTI    |   72 |   90 |   INA |  ANI/IDA | 
+-----------------+------------+------------+----------------+----------------+ 
5 rows in set (0.03 sec) 

所以我做了很多的查询,但没有一个人工作,其中的两个是:

mysql> select matkul, max(nilai), nama from nilai group by matkul; 
+-----------------+------------+------+ 
| matkul   | max(nilai) | nama | 
+-----------------+------------+------+ 
| ALGORITMA  |   92 | ADI | 
| KALKULUS  |   70 | ADI | 
| PBO    |   90 | ADI | 
| PEMROGRAMAN WEB |   92 | ADI | 
| PTI    |   90 | ADI | 
+-----------------+------------+------+ 
5 rows in set (0.00 sec) 

mysql> select matkul, (select nama from nilai having max(nilai) as maxname), (select 
nama from nilai having min(nilai) as minname) from nilai group by matkul; 

+-----------------+---------+---------+ 
| matkul   | maxname | minname | 
+-----------------+---------+---------+ 
| ALGORITMA  | ADI  | ADI  | 
| KALKULUS  | ADI  | ADI  | 
| PBO    | ADI  | ADI  | 
| PEMROGRAMAN WEB | ADI  | ADI  | 
| PTI    | ADI  | ADI  | 
+-----------------+---------+---------+ 
5 rows in set (0.08 sec) 

那么,如何可以让这一切作品,请给我的建议,在此先感谢! :d

回答

1

在MySQL中,我觉得最简单的方法是用substring_index()/group_concat()招:

select matkul, min(nilai), max(nilai), 
     substring_index(group_concat(nama order by nilai asc), ',', 1) as min_nama, 
     substring_index(group_concat(nama order by nilai desc), ',', 1) as max_nama 
from nilai 
group by matkul; 

如果你有很多很多的学生同样的主题,那么你可能会遇到的长度问题字符串。另外,你只能得到一个学生的名字。

如果这是一个问题,你可以使用相关子查询或联接:

select matkul, min(nilai), max(nilai), 
     (select nama from nilai n2 where n2.matkul = n.matkul order by nilai asc limit 1) as min_nama, 
     (select nama from nilai n2 where n2.matkul = n.matkul order by nilai desc limit 1) as max_nama 
from nilai n 
group by matkul; 
+0

感谢您回复我的信息。我承认我之前没有读过关于group_concat和substring_index的内容。下一次,我会在询问之前深入搜寻。 – januaryananda 2014-09-28 17:55:02

+0

是否有另一种方法使其一切正常? – januaryananda 2014-09-28 17:55:18

+0

n2和n来自哪里?他们是不确定的,不是吗? – januaryananda 2014-09-28 18:16:49

0
| PTI    |   72 |   90 |   INA |  ANI/IDA | 

它看起来像你想要当有min belongs tomax belongs to关系返回多个学生。您可以通过从派生表中进行选择来达到此目的,其中每行包含每个科目和分数的学生列表,并将这些分数加入到最大/最小分数中。

select t1.matkul, t1.min_nilai, t1.max_nilai, 
     t2.min_belongs_to, t3.max_belongs_to 
from (
    select matkul, min(nilai) min_nilai, max(nilai) max_nilai 
    from nilai group by matkul 
) t1 
join (
    select nilai, matkul, group_concat(nama) min_belongs_to 
    from nilai group by nilai, matkul 
) t2 on t1.min_nilai = t2.nilai and t1.matkul = t2.matkul 
join (
    select nilai, matkul, group_concat(nama) max_belongs_to 
    from nilai group by nilai, matkul 
) t3 on t1.max_nilai = t3.nilai and t1.matkul = t3.matkul 
0

一种方式 - 如果你想联系的出现,是分裂查询分成两个查询的工会 - 一个用于分钟和一个最大 - 和外部查询将它们结合起来;

SELECT matkul, MIN(nilai), MAX(nilai), MIN(nama_min), MAX(nama_max) FROM (
    SELECT matkul, nilai, null nama_min, GROUP_CONCAT(nama SEPARATOR '/') nama_max 
    FROM nilai n1 
    WHERE NOT EXISTS(
    SELECT 1 FROM nilai n2 WHERE n1.matkul = n2.matkul AND n1.nilai < n2.nilai 
) 
    GROUP BY matkul 
    UNION ALL 
    SELECT matkul, nilai, GROUP_CONCAT(nama SEPARATOR '/') nama_min, null 
    FROM nilai n1 
    WHERE NOT EXISTS(
    SELECT 1 FROM nilai n2 WHERE n1.matkul = n2.matkul AND n1.nilai > n2.nilai 
) 
    GROUP BY matkul 
)z 
GROUP BY matkul; 

An SQLfiddle to test with

0
select matkul, min(nilai) nilaiMIN, max(nilai) naliMAX 
,(select nama from nilai where nilai = (select min(nilai) from nilai where matkul = n.matkul))   namaMIN 
,(select nama from nilai where nilai = (select max(nilai) from nilai where matkul = n.matkul)) namaMAX 
from nilai n group by matkul