使用join在mysql上排名

时间:2017-02-02 13:03:39

标签: mysql sql

我需要在2个连接表上显示我的sql的排名,我的mysql查询要显示

SELECT a.UserID, b.Nama,a.Matematika,a.IPA,a.IPS,a.BIND,a.BING,a.Rata,
       FIND_IN_SET( a.Rata, (SELECT GROUP_CONCAT( a.Rata ORDER BY a.Rata DESC ) FROM datanilaiujian )) AS rank
from datanilaiujian as a JOIN
     datauser as b
     ON a.UserID=b.UserID
ORDER BY a.Rata DESC

但是当我执行此命令时,mysql返回错误代码:1242。子查询返回超过1行

表格datanilaiujian上的

列表字段

UserID  Matematika IPA   IPS  BIND BING  Rata
1000    90         76     78.9  78  65    77.58
1001    78.9       87     67    56  78    73.38
1002    80         78.9 67  55  65.9  69.36
1003    78.9       56     77    88  90    77.97999999999999

表datauser上的列表字段

UserID  Pass    Nama    Alamat      NoTelepon       AsalSekolah          Tanggal Masuk    NilaiUN
1000    1000    Habib   Jl.sesama   232323232323    23dsdsdsfsdfsdfsdfsdff  2017-01-13 19:35:22 Sudah
1001    1001    wisnu   jl sesama   085600336706    SMA 2 Purwokerto    2017-01-28 17:35:32 Sudah
1002    1002    Arif    Jl Sungkio  085600336706    SMA BINTEK  2017-01-28 19:30:56 Sudah
1003    1003    Akbar   Jl sesama   085600133558    SMPN 1 Purwokerto   2017-02-02 18:59:47 Sudah

我的预期结果:

Nama   Matematika    IPA   IPS    BIND    BING    Rata    Rank

1 个答案:

答案 0 :(得分:0)

我看到了问题。你的子查询是a.Rata。这是指外部表。我怀疑GROUP_CONCAT()混淆了MySQL,所以子查询不会被解释为聚合查询。

但是,您应该将子查询移动到FROM子句:

SELECT a.*,
       FIND_IN_SET( a.Rata, l.list) AS rank
from datanilaiujian a JOIN
     datauser b
     ON a.UserID = b.UserID CROSS JOIN
     (SELECT GROUP_CONCAT( a2.Rata ORDER BY a2.Rata DESC ) as list
      FROM datanilaiujian a2
     ) l
ORDER BY a.Rata DESC;

这通常有助于优化器选择最佳执行计划。