0

関連しているとは思わなかった複雑なレイヤーを1つ見逃しましたが、MIN() の提案がこれで機能しないように見えるためです。

次のようなテーブルがあります。

col-1 | col-b | col-c | col-d
----------------------------------
mhm1  | a     | 09:20 | 2013-09-21
mhm1  | b     | 09:21 | 2013-09-20
mhm1  | c     | 09:22 | 2013-09-19
mhm1  | c     | 09:23 | 2013-09-18
mhm1  | d     | 09:24 | 2013-09-19
mhm2  | a     | 09:25 | 2013-09-21
mhm2  | c     | 09:26 | 2013-09-20
mhm2  | d     | 09:27 | 2013-09-19
mhm2  | c     | 09:28 | 2013-09-18

col-b = 'c' である一意の col-1 ごとに最初の行を返すクエリが必要です。

例えば

col-1 | col-b | col-c | col-d
---------------------------------
mhm1  | c     | 09:23 | 2013-09-18
mhm2  | c     | 09:28 | 2013-09-18

これを達成するための適切な SQL-Request は何でしょうか? 私が試してみました:

SELECT col-a, col-b, min(col-c), min(col-d) FROM MY TABLE
WHERE col-b = 'c'
GROUP BY col-a
ORDER BY col-c ASC

しかし、私は得る:

col-1 | col-b | col-c | col-d
---------------------------------
mhm1  | c     | 09:22 | 2013-09-18
mhm2  | c     | 09:26 | 2013-09-18

これは私が望むものではありません。

ありがとう

4

3 に答える 3

0

MIN() 関数を使用して、そのグループの最小値が必要であることを MySQL に伝えます。

SELECT col-a, col-b, MIN(col-c) FROM MY_TABLE
WHERE col-b = 'c'
GROUP BY col-a
/* ORDER BY col-c ASC <-- this is not necessary*/

これはあなたの例で機能します。しかし、それは危険な場合があります。他の列の値は、最小の col-c 値を持つ行に属している必要はありません。これを実現するには、次のように記述する必要があります。

SELECT col-a, col-b, col-c FROM MY_TABLE t
WHERE col-b = 'c'
AND col-c = (SELECT MIN(col-c) FROM yourTable yt WHERE yt.col-a = t.col-a)
GROUP BY col-a

その他の例については、このマニュアル エントリを参照してください。

于 2013-06-06T13:43:34.123 に答える
0

MIN()function to col-c を使用してこれを達成できると思います

SELECT col-1, col-b, MIN(col-c)
FROM MY TABLE
WHERE col-b = 'c'
GROUP BY col-1
ORDER BY col-c ASC

ライブ SQLFiddle

于 2013-06-06T13:43:47.360 に答える
0
DROP TABLE IF EXISTS my_test;

CREATE TABLE my_test (col1 CHAR(4) NOT NULL,colb CHAR(1) NOT NULL,colc TIME NOT NULL,PRIMARY KEY(col1,colb,colc));

INSERT INTO my_test VALUES
('mhm1','a','09:20:00'),
('mhm1','b','09:21:00'),
('mhm1','c','09:22:00'),
('mhm1','c','09:23:00'),
('mhm1','d','09:24:00'),
('mhm2','a','09:25:00'),
('mhm2','c','09:26:00'),
('mhm2','d','09:27:00'),
('mhm2','c','09:28:00');

SELECT x.* 
  FROM my_test x 
  JOIN 
     ( SELECT col1,colb,MIN(colc) min_colc FROM my_test GROUP BY col1,colb) y 
    ON y.col1 = x.col1 
   AND y.colb=x.colb 
   AND y.min_colc = x.colc 
WHERE x.colb = 'c';
+------+------+----------+
| col1 | colb | colc     |
+------+------+----------+
| mhm1 | c    | 09:22:00 |
| mhm2 | c    | 09:26:00 |
+------+------+----------+
于 2013-06-06T13:49:19.040 に答える