SQL:选择最多两次出现

时间:2012-10-11 02:06:05

标签: mysql sql select

我在sql中有点问题,我无法达到构建正确语句的方法。当“etud”和“mod”在出现时相等时,我需要在结果中只包含具有最大“sess”的行:

etud|sess|mod|eta
1------1---M1--nv
1------2---M1--v
2------1---M1--nv
3------1---M1--v
4------1---M1--v

现在我需要的结果是:

etud|sess|mod|eta
1------2---M1--v
2------1---M1--nv
3------1---M1--v
4------1---M1--v

提前致谢。

4 个答案:

答案 0 :(得分:3)

这只是一个MAX() aggregate,按etudmod进行分组:

SELECT
  etud,
  MAX(sess) AS sess,
  mod
FROM yourtable
GROUP BY etud, mod

编辑后的更新:

虽然MySQL允许您只是将列添加到上面的查询而不将其添加到GROUP BY,但您获得的该列的值是非确定性的,如果您有多个可能的值,则可以'计划你将得到哪一个(通常它将是第一个)。

要引入与eta匹配的剩余MAX(sess)列,您可以加入子查询。

SELECT
  main.etud,
  maxsess.maxsess AS sess
  main.mod,
  main.eta
FROM
  yourtable
  JOIN (
    SELECT
      etud,
      MAX(sess) AS maxsess,
      mod
    FROM yourtable
    GROUP BY etud, mod
    /* JOIN all 3 columns of the subquery which gets the MAX() against the rest of the table */
  ) maxsess ON main.etud = maxsess.etud AND main.sess = maxsess.maxsess AND main.mod = maxsess.mod

答案 1 :(得分:3)

SELECT  etud,max(sess),  mod1
FROM tblA
GROUP BY etud, mod1

SQL FIDDLE here.

答案 2 :(得分:3)

您可以使用aggregate functions。我假设您只想要通过此查询检索的每个sess配对中的最大etud-mod

SELECT etud, max(sess) as sess, mod FROM table GROUP BY etud, mod;

但是,如果您只想删除最小sess并获取其他行,那么这就是一个解决方案:

SELECT etud, sess, mod
FROM table 
JOIN (SELECT etud, min(sess) as sess, mod FROM table GROUP BY etud, mod) AS mintable
  ON table.etud = mintable.etud 
    AND table.mod = mintable.mod
    AND table.sess <> mintable.sess

以你的问题为例。

etud|sess|mod
1------1------M1
1------2------M1
1------3------M1
2------1------M1
2------2------M1

首先查询将返回

etud|sess|mod
1------3------M1
2------2------M1

第二个查询将返回

etud|sess|mod
1------2------M1
1------3------M1
2------2------M1

答案 3 :(得分:0)

这是SQL表&amp;刀片:     create table esm(etud INT(11),sess INT(11),modval char(3))

INSERT INTO esm (etud,sess,modval) VALUES ( 1,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 1,2,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 2,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 3,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 4,1,'M1');

和查询:

SELECT esm1.* FROM esm esm1
INNER JOIN (SELECT MIN(etud) as minetud, sess, modval
FROM  esm
GROUP BY   sess, modval) esm2
ON esm1.sess=esm2.sess AND esm1.modval=esm2.modval
WHERE esm1.etud <> minetud;

我的结果与您期望的结果不同,但我认为它们反映了您对问题的陈述。

+------+------+--------+
| etud | sess | modval |
+------+------+--------+
|    2 |    1 | M1     | 
|    3 |    1 | M1     | 
|    4 |    1 | M1     | 
+------+------+--------+