0

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

4 に答える 4

3

これは実際には単なるMAX()集合体etudであり、およびでグループ化されていmodます。

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
于 2012-10-11T02:09:52.840 に答える
3
SELECT  etud,max(sess),  mod1
FROM tblA
GROUP BY etud, mod1

SQLFIDDLEはこちら。

于 2012-10-11T02:11:21.993 に答える
3

集計関数を使用できます。このクエリで取得できるsess各ペアリングからの最大値のみが必要であると想定しています。etud-mod

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

sessしかし、最小値を削除して他の行を取得したいという偶然の場合、これが1つの解決策です。

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

2番目のクエリは

etud|sess|mod
1------2------M1
1------3------M1
2------2------M1
于 2012-10-11T02:14:13.263 に答える
0

SQLテーブルと挿入は次のとおりです。createtableesm(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     | 
+------+------+--------+
于 2012-10-11T02:43:19.187 に答える